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.

155 lines
5.4 KiB

6 months ago
from helpers import AuthorRequiredMixin, get_page_list
from django.contrib import messages
from django.contrib.auth import authenticate, login as auth_login, logout as auth_logout
from django.contrib.auth import get_user_model
from django.contrib.auth import update_session_auth_hash
from django.contrib.auth.mixins import LoginRequiredMixin
from django.shortcuts import *
from django.views import generic
from ratelimit.decorators import ratelimit
6 months ago
6 months ago
from .models import Feedback
from .forms import ProfileForm, SignUpForm, UserLoginForm, ChangePwdForm, SubscribeForm, FeedbackForm
User = get_user_model()
def login(request):
6 months ago
if request.method == 'POST':
next = request.POST.get('next', '/')
form = UserLoginForm(request=request, data=request.POST)
if form.is_valid():
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
user = authenticate(username=username, password=password)
if user is not None:
auth_login(request, user)
# return redirect('home')
return redirect(next)
else:
print(form.errors)
else:
next = request.GET.get('next', '/')
form = UserLoginForm()
print(next)
return render(request, 'registration/login.html', {'form': form, 'next':next})
def signup(request):
if request.method == 'POST':
form = SignUpForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
raw_password1 = form.cleaned_data.get('password1')
user = authenticate(username=username, password=raw_password1)
auth_login(request, user)
return redirect('home')
else:
print(form.errors)
else:
form = SignUpForm()
return render(request, 'registration/signup.html', {'form': form})
def logout(request):
auth_logout(request)
return redirect('home')
def change_password(request):
if request.method == 'POST':
form = ChangePwdForm(request.user, request.POST)
if form.is_valid():
user = form.save(commit=False)
if not user.is_staff and not user.is_superuser:
user.save()
update_session_auth_hash(request, user) # 更新session 非常重要!
messages.success(request, '修改成功')
return redirect('users:change_password')
else:
messages.warning(request, '无权修改管理员密码')
return redirect('users:change_password')
else:
print(form.errors)
else:
form = ChangePwdForm(request.user)
return render(request, 'registration/change_password.html', {
'form': form
})
class ProfileView(LoginRequiredMixin,AuthorRequiredMixin, generic.UpdateView):
model = User
form_class = ProfileForm
template_name = 'users/profile.html'
def get_success_url(self):
messages.success(self.request, "保存成功")
return reverse('users:profile', kwargs={'pk': self.request.user.pk})
class SubscribeView(LoginRequiredMixin,AuthorRequiredMixin, generic.UpdateView):
model = User
form_class = SubscribeForm
template_name = 'users/subscribe.html'
def get_success_url(self):
messages.success(self.request, "保存成功")
return reverse('users:subscribe', kwargs={'pk': self.request.user.pk})
6 months ago
6 months ago
class FeedbackView(LoginRequiredMixin, generic.CreateView):
model = Feedback
form_class = FeedbackForm
template_name = 'users/feedback.html'
@ratelimit(key='ip', rate='2/m')
def post(self, request, *args, **kwargs):
was_limited = getattr(request, 'limited', False)
if was_limited:
messages.warning(self.request, "操作太频繁了请1分钟后再试")
return render(request, 'users/feedback.html', {'form': FeedbackForm()})
return super().post(request, *args, **kwargs)
def get_success_url(self):
messages.success(self.request, "提交成功")
return reverse('users:feedback')
class CollectListView(generic.ListView):
model = User
template_name = 'users/collect_videos.html'
context_object_name = 'video_list'
paginate_by = 10
def get_context_data(self, *, object_list=None, **kwargs):
context = super(CollectListView, self).get_context_data(**kwargs)
paginator = context.get('paginator')
page = context.get('page_obj')
page_list = get_page_list(paginator, page)
context['page_list'] = page_list
return context
6 months ago
def get_queryset(self):
user = get_object_or_404(User, pk=self.kwargs.get('pk'))
6 months ago
videos = user.collected_videos.all()
6 months ago
return videos
6 months ago
class LikeListView(generic.ListView):
model = User
template_name = 'users/like_videos.html'
context_object_name = 'video_list'
paginate_by = 10
def get_context_data(self, *, object_list=None, **kwargs):
context = super(LikeListView, self).get_context_data(**kwargs)
paginator = context.get('paginator')
page = context.get('page_obj')
page_list = get_page_list(paginator, page)
context['page_list'] = page_list
return context
def get_queryset(self):
user = get_object_or_404(User, pk=self.kwargs.get('pk'))
videos = user.liked_videos.all()
return videos