You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

140 lines
5.1 KiB

from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from .forms import ProfileUpdateForm
from .models import UserProfile, Follow
from Community.models import Like, Comment, Post
from users.models import CustomUser
from Schedule.models import Event, Task
from datetime import datetime, timedelta
from django.http import JsonResponse
@login_required(login_url='login')
def my_page_view(request):
# 当前登录用户
user = request.user
profile = user.profile
# 上传、修改资料
if request.method == 'POST':
form = ProfileUpdateForm(request.POST, request.FILES, instance=user)
if form.is_valid():
# 保存 username(avatar 字段不能自动保存)
user.username = form.cleaned_data.get('username', user.username)
if request.FILES.get('avatar'):
user.avatar = request.FILES['avatar'] # ✅ 手动保存头像
user.save()
# 更新 UserProfile 的字段
profile.bio = request.POST.get('bio', '')
if 'personal_background' in request.FILES:
profile.personal_background = request.FILES['personal_background']
if 'page_background' in request.FILES:
profile.page_background = request.FILES['page_background']
profile.save()
return redirect('my_page')
else:
form = ProfileUpdateForm(instance=user)
# 我关注的人
follows = Follow.objects.filter(follower=user).select_related('followed')
# 我的帖子
my_posts = Post.objects.filter(user=user).order_by('-created_at')
# 我的点赞
liked_posts = Post.objects.filter(like__user=user).distinct()
# 我的收藏
favorited_posts = Post.objects.filter(favorite__user=user).distinct()
# 通知:别人点赞/评论了我的帖子
recent_likes = Like.objects.filter(post__user=user).exclude(user=user).select_related('user', 'post').order_by('-created_at')[:10]
recent_comments = Comment.objects.filter(post__user=user).exclude(user=user).select_related('user', 'post').order_by('-created_at')[:10]
# 获取今天以后的最近3条日程
now = datetime.now()
upcoming_events = Event.objects.filter(user=request.user).filter(
date__gt=now.date()
) | Event.objects.filter(
user=request.user,
date=now.date(),
time__gte=now.time()
)
upcoming_events = upcoming_events.order_by('date', 'time')[:3]
# 获取未完成任务(最近添加的3个)
recent_tasks = Task.objects.filter(
user=request.user,
completed=False
).order_by('-created_at')[:3]
return render(request, 'myPage.html', {
'form': form,
'user': user,
'profile': profile,
'follows': follows,
'my_posts': my_posts,
'liked_posts': liked_posts,
'favorited_posts': favorited_posts,
'recent_likes': recent_likes,
'recent_comments': recent_comments,
'upcoming_events': upcoming_events,
'recent_tasks': recent_tasks,
})
# 头像图片上传
def upload_avatar(request):
if request.method == 'POST' and request.user.is_authenticated:
user = request.user
if 'avatar' in request.FILES:
user.avatar = request.FILES['avatar']
user.save()
return JsonResponse({'success': True, 'avatar_url': user.avatar.url})
else:
return JsonResponse({'success': False, 'message': '没有接收到avatar文件'})
return JsonResponse({'success': False, 'message': '请求失败,必须为POST并登录'})
# 个人资料背景上传
def upload_banner(request):
if request.method == 'POST' and request.user.is_authenticated:
profile = request.user.profile
if 'personal_background' in request.FILES:
profile.personal_background = request.FILES['personal_background']
profile.save()
return JsonResponse({'success': True, 'bg_url': profile.personal_background.url})
else:
return JsonResponse({'success': False, 'message': '未收到文件'})
return JsonResponse({'success': False, 'message': '权限或方法错误'})
# 页面背景图片上传
def upload_page_background(request):
if request.method == 'POST' and request.user.is_authenticated:
profile = request.user.profile
if 'page_background' in request.FILES:
profile.page_background = request.FILES['page_background']
profile.save()
return JsonResponse({'success': True, 'bg_url': profile.page_background.url})
else:
return JsonResponse({'success': False, 'message': '未收到文件'})
return JsonResponse({'success': False, 'message': '权限或方法错误'})
# 删除帖子
@login_required(login_url='login')
def delete_post(request, post_id):
post = get_object_or_404(Post, id=post_id, user=request.user)
if request.method == 'POST':
post.delete()
messages.success(request, "帖子已删除!")
return redirect('my_page')