Skip to content

Commit 03dfabf

Browse files
committed
logon-logout and flashes
1 parent e1bab4a commit 03dfabf

File tree

5 files changed

+78
-12
lines changed

5 files changed

+78
-12
lines changed

accounts/forms.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from django import forms
2+
from django.contrib.auth.forms import UserCreationForm
3+
from django.contrib.auth.models import User
4+
5+
6+
class CustomUserCreationForm(UserCreationForm):
7+
first_name = forms.CharField(label='Имя', max_length=150, required=False)
8+
last_name = forms.CharField(label='Фамилия', max_length=150, required=False)
9+
10+
class Meta(UserCreationForm.Meta):
11+
model = User
12+
fields = ('username', 'first_name', 'last_name', 'password1', 'password2')

accounts/urls.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# accounts/urls.py
22
from django.urls import path
3-
from django.contrib.auth.views import LoginView, LogoutView
4-
from .views import UserListView, UserUpdateView, UserDeleteView, UserCreateView
3+
from django.contrib.auth.views import LoginView
4+
from .views import UserListView, UserUpdateView, UserDeleteView, UserCreateView, UserLogoutView, UserLoginView
55

66
app_name = "users"
77

@@ -11,6 +11,6 @@
1111
path("<int:pk>/update/", UserUpdateView.as_view(), name="update"),
1212
path("<int:pk>/delete/", UserDeleteView.as_view(), name="delete"),
1313
# auth
14-
path("login/", LoginView.as_view(template_name="users/login.html"), name="login"),
15-
path("logout/", LogoutView.as_view(), name="logout"),
14+
path("login/", UserLoginView.as_view(template_name="users/login.html"), name="login"),
15+
path('logout/', UserLogoutView.as_view(), name='logout'),
1616
]

accounts/views.py

Lines changed: 54 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
# accounts/views.py
2+
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
23
from 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
37
from django.views.generic import ListView, UpdateView, DeleteView
48
from django.urls import reverse_lazy
59
from django.views.generic import CreateView
6-
from django.contrib.auth.forms import UserCreationForm
10+
from .forms import CustomUserCreationForm
11+
712

813
class 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")

db.sqlite3

0 Bytes
Binary file not shown.

templates/base.html

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,22 @@
1515
<a class="navbar-brand" href="/">Менеджер Задач</a>
1616
<div>
1717
<ul class="navbar-nav me-auto mb-2 mb-md-0">
18+
{% if user.is_authenticated %}
19+
<form method="post" action="{% url 'users:logout' %}">
20+
{% csrf_token %}
21+
<button class="btn btn-outline-light btn-sm" type="submit">Выйти</button>
22+
</form>
23+
{% else %}
1824
<li class="nav-item"><a class="nav-link" href="{% url 'users:login' %}">Вход</a></li>
1925
<li class="nav-item"><a class="nav-link" href="{% url 'users:create' %}">Регистрация</a></li>
26+
{% endif %}
2027
<li class="nav-item"><a class="nav-link" href="{% url 'users:list' %}">Пользователи</a></li>
2128
</ul>
2229
</div>
2330
</div>
2431
</nav>
25-
2632
<main class="container">
33+
{% bootstrap_messages %}
2734
{% block content %}{% endblock %}
2835
</main>
2936
</body>

0 commit comments

Comments
 (0)