Skip to content

Commit 6ea6735

Browse files
committed
step 3 done
1 parent d889b30 commit 6ea6735

File tree

9 files changed

+144
-10
lines changed

9 files changed

+144
-10
lines changed

db.sqlite3

0 Bytes
Binary file not shown.

task_manager/forms.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
2+
from django.contrib.auth.models import User
3+
from django import forms
4+
5+
class UserRegisterForm(UserCreationForm):
6+
class Meta:
7+
model = User
8+
fields = ('username', 'first_name', 'last_name', 'email')
9+
10+
class UserUpdateForm(UserChangeForm):
11+
password = None # не показываем поле пароля для редактирования
12+
13+
class Meta:
14+
model = User
15+
fields = ('username', 'first_name', 'last_name', 'email')

task_manager/templates/base.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<body>
1111
<nav class="navbar navbar-expand-lg navbar-light bg-light">
1212
<div class="container-fluid">
13-
<a class="navbar-brand" href="#">MyApp</a>
13+
<a class="navbar-brand" href="#">Менеджер задач</a>
1414
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
1515
<span class="navbar-toggler-icon"></span>
1616
</button>
@@ -23,7 +23,7 @@
2323
<a class="nav-link" href="{% url 'register' %}">Регистрация</a>
2424
</li>
2525
<li class="nav-item">
26-
<a class="nav-link" href="{% url 'users' %}">Пользователи</a>
26+
<a class="nav-link" href="{% url 'user-list' %}">Пользователи</a>
2727
</li>
2828
</ul>
2929
</div>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{% extends "base.html" %}
2+
{% block content %}
3+
<h1>Вход</h1>
4+
<form method="post">
5+
{% csrf_token %}
6+
{{ form.as_p }}
7+
<button type="submit" class="btn btn-primary">Войти</button>
8+
</form>
9+
{% endblock %}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{% extends "base.html" %}
2+
{% block content %}
3+
<h1>Удалить пользователя {{ object.username }}?</h1>
4+
<form method="post">
5+
{% csrf_token %}
6+
<button type="submit" class="btn btn-danger">Удалить</button>
7+
<a href="{% url 'user-list' %}">Отмена</a>
8+
</form>
9+
{% endblock %}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{% extends "base.html" %}
2+
{% block content %}
3+
<h1>{% if form.instance.pk %}Редактировать пользователя{% else %}Регистрация{% endif %}</h1>
4+
<form method="post">
5+
{% csrf_token %}
6+
{{ form.as_p }}
7+
<button type="submit" class="btn btn-primary">
8+
{% if form.instance.pk %}Сохранить{% else %}Зарегистрироваться{% endif %}
9+
</button>
10+
</form>
11+
{% endblock %}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{% extends "base.html" %}
2+
{% block content %}
3+
<h1>Пользователи</h1>
4+
<a href="{% url 'user-create' %}">Зарегистрировать нового пользователя</a>
5+
<ul>
6+
{% for user in users %}
7+
<li>
8+
{{ user.username }}
9+
{% if request.user == user %}
10+
<a href="{% url 'user-update' user.pk %}">Редактировать</a>
11+
<a href="{% url 'user-delete' user.pk %}">Удалить</a>
12+
{% endif %}
13+
</li>
14+
{% empty %}
15+
<li>Пользователей нет</li>
16+
{% endfor %}
17+
</ul>
18+
{% endblock %}

task_manager/urls.py

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,35 @@
11
from django.contrib import admin
2-
from django.urls import path, include
3-
from django.contrib.auth import views as auth_views
2+
from django.urls import path
43
from django.views.generic import TemplateView
5-
from .views import users_view, register_view # Импорт функций-представлений
4+
from .views import (
5+
UserListView, UserCreateView, UserUpdateView, UserDeleteView,
6+
UserLoginView, UserLogoutView, register_view
7+
)
68

79
urlpatterns = [
810
path('admin/', admin.site.urls),
9-
path('accounts/', include('django.contrib.auth.urls')),
10-
path('login/', auth_views.LoginView.as_view(), name='login'),
11-
path('register/', register_view, name='register'), # без .as_view()
12-
path('users/', users_view, name='users'), # без .as_view()
11+
path('register/', register_view, name='register'),
1312
path('', TemplateView.as_view(template_name='index.html'), name='home'),
13+
path('users/', UserListView.as_view(), name='user-list'), # Обратите внимание на имя
14+
path('users/create/', UserCreateView.as_view(), name='user-create'),
15+
path('users/<int:pk>/update/', UserUpdateView.as_view(), name='user-update'),
16+
path('users/<int:pk>/delete/', UserDeleteView.as_view(), name='user-delete'),
17+
path('login/', UserLoginView.as_view(), name='login'),
18+
path('logout/', UserLogoutView.as_view(), name='logout'),
1419
]
20+
21+
22+
23+
# from django.urls import path, include
24+
# from django.contrib.auth import views as auth_views
25+
# from django.views.generic import TemplateView
26+
# from .views import users_view, register_view # Импорт функций-представлений
27+
#
28+
# urlpatterns = [
29+
# path('admin/', admin.site.urls),
30+
# path('accounts/', include('django.contrib.auth.urls')),
31+
# path('login/', auth_views.LoginView.as_view(), name='login'),
32+
# path('register/', register_view, name='register'), # без .as_view()
33+
# path('users/', users_view, name='users'), # без .as_view()
34+
# path('', TemplateView.as_view(template_name='index.html'), name='home'),
35+
# ]

task_manager/views.py

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,13 @@
33
from django.contrib.auth.forms import AuthenticationForm
44
from django.shortcuts import render, redirect
55
from django.contrib.auth import login
6+
from django.contrib.auth.models import User
7+
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
8+
from django.urls import reverse_lazy
9+
from django.views.generic import ListView, CreateView, UpdateView, DeleteView
10+
from django.contrib.auth.views import LoginView, LogoutView
11+
from .forms import UserRegisterForm, UserUpdateForm
12+
613

714
def home_view(request):
815
return render(request, 'index.html')
@@ -38,4 +45,48 @@ def login_view(request):
3845
user = form.get_user()
3946
login(request, user)
4047
return redirect('home')
41-
return render(request, 'login.html', {'form': form})
48+
return render(request, 'login.html', {'form': form})
49+
50+
class UserListView(ListView):
51+
model = User
52+
template_name = 'users/user_list.html'
53+
context_object_name = 'users'
54+
55+
# Создание пользователя (регистрация)
56+
class UserCreateView(CreateView):
57+
model = User
58+
form_class = UserRegisterForm
59+
template_name = 'users/user_form.html'
60+
success_url = reverse_lazy('login') # после регистрации — вход
61+
62+
# Редактирование пользователя — только сам пользователь
63+
class UserUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
64+
model = User
65+
form_class = UserUpdateForm
66+
template_name = 'users/user_form.html'
67+
success_url = reverse_lazy('user-list')
68+
69+
def test_func(self):
70+
user = self.get_object()
71+
return self.request.user == user
72+
73+
# Удаление пользователя — только сам пользователь
74+
class UserDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
75+
model = User
76+
template_name = 'users/user_confirm_delete.html'
77+
success_url = reverse_lazy('user-list')
78+
79+
def test_func(self):
80+
user = self.get_object()
81+
return self.request.user == user
82+
83+
# Вход
84+
class UserLoginView(LoginView):
85+
template_name = 'users/login.html'
86+
87+
def get_success_url(self):
88+
return reverse_lazy('home') # замените на ваш URL главной страницы
89+
90+
# Выход
91+
class UserLogoutView(LogoutView):
92+
next_page = reverse_lazy('login')

0 commit comments

Comments
 (0)