11# accounts/views.py
2+ from django .contrib .auth .mixins import LoginRequiredMixin , UserPassesTestMixin
23from django .contrib .auth .models import User
4+ from django .contrib import messages
5+ from django .contrib .auth .views import LogoutView , LoginView
6+ from django .shortcuts import redirect
37from django .views .generic import ListView , UpdateView , DeleteView
48from django .urls import reverse_lazy
59from django .views .generic import CreateView
6- from django .contrib .auth .forms import UserCreationForm
10+ from .forms import CustomUserCreationForm
11+
712
813class UserListView (ListView ):
914 model = User
@@ -12,20 +17,62 @@ class UserListView(ListView):
1217 ordering = ["username" ]
1318
1419
15- class UserUpdateView (UpdateView ):
20+ class OnlySelfMixin (UserPassesTestMixin ):
21+ def test_func (self ):
22+ obj = self .get_object ()
23+ return self .request .user .is_authenticated and obj .pk == self .request .user .pk
24+
25+ def handle_no_permission (self ):
26+ messages .error (self .request , "У вас нет прав для изменения другого пользователя." )
27+ return redirect ("users:list" )
28+
29+
30+ class UserCreateView (CreateView ):
31+ form_class = CustomUserCreationForm
32+ template_name = "users/create.html"
33+ success_url = reverse_lazy ("users:list" )
34+
35+ def form_valid (self , form ):
36+ response = super ().form_valid (form )
37+ messages .success (self .request , "Пользователь успешно создан." )
38+ return response
39+
40+
41+ class UserUpdateView (LoginRequiredMixin , OnlySelfMixin , UpdateView ):
1642 model = User
1743 fields = ["username" , "first_name" , "last_name" ]
1844 template_name = "users/update.html"
1945 success_url = reverse_lazy ("users:list" )
2046
47+ def form_valid (self , form ):
48+ response = super ().form_valid (form )
49+ messages .success (self .request , "Изменения успешно сохранены." )
50+ return response
2151
22- class UserDeleteView (DeleteView ):
52+
53+ class UserDeleteView (LoginRequiredMixin , OnlySelfMixin , DeleteView ):
2354 model = User
2455 template_name = "users/delete.html"
2556 success_url = reverse_lazy ("users:list" )
2657
58+ def delete (self , request , * args , ** kwargs ):
59+ messages .success (self .request , "Пользователь успешно удалён." )
60+ return super ().delete (request , * args , ** kwargs )
61+
62+
63+ class UserLoginView (LoginView ):
64+ template_name = 'users/login.html'
65+ next_page = reverse_lazy ('home' ) # куда редиректить после входа
66+
67+ def form_valid (self , form ):
68+ messages .success (self .request , "Вы успешно залогинены." )
69+ return super ().form_valid (form )
70+
71+
72+ class UserLogoutView (LogoutView ):
73+ next_page = reverse_lazy ('home' )
74+
75+ def dispatch (self , request , * args , ** kwargs ):
76+ messages .info (request , "Вы успешно разлогинены." )
77+ return super ().dispatch (request , * args , ** kwargs )
2778
28- class UserCreateView (CreateView ):
29- form_class = UserCreationForm
30- template_name = "users/create.html"
31- success_url = reverse_lazy ("users:list" )
0 commit comments