При нажатии на "Изменить пароль" появляется ошибка:
NoReverseMatch в /auth/password_change/ Реверс для 'table_list' с аргументами '('',)' не найден. Пробовали 1 шаблон(ы): ['groups/(?P[-a-zA-Z0-9_]+)/$']
заголовок.html
{% if request.user.is_authenticated %}
<li class = "nav-item">
<a class = "nav-link {% if view_name == 'schedules:tabel_list' %}active{% endif %}"
href = "{% url 'schedules:tabel_list' student.group.slug %}"
>
Расписание
</a>
</li>
<li class = "nav-item">
<a class = "nav-link disabled" href = "#">Модульный журнал</a>
</li>
<li class = "nav-item">
<a class = "nav-link disabled" href = "#">Библиотека</a>
</li>
{% endif %}
расписания/views.py
@login_required
def tabel_list(request, slug_group):
DAY_WEEK_LIST = ({
'MONDAY': 'Понедельник',
'TUESDAY': 'Вторник',
'WEDNESDAY': 'Среда',
'THURSDAY': 'Четверг',
'FRIDAY': 'Пятница',
'SATURDAY': 'Суббота',
'SUNDAY': 'Воскресенье',
})
group = get_object_or_404(Group, slug=slug_group)
tablets = Tablet.objects.filter(group=group)
username = request.user.username
student = Student.objects.get(student_id__username=username)
day_week_en = []
set_day_week = []
for lesson in tablets:
if lesson.day_week not in day_week_en:
day_week_en.append(lesson.day_week)
for day_en in day_week_en:
set_day_week.append(DAY_WEEK_LIST[day_en])
context = {
'tablets': tablets,
'group': group,
'set_day_week': set_day_week,
'student': student,
}
return render(request, 'schedules/tabel_list.html', context)
расписания/urls.py
``from django.urls import path
from . import views
app_name = 'schedules'
urlpatterns = [
path('', views.index, name='index'),
path('groups/', views.group_list_all, name='groups_list_all'),
path('groups/<slug:slug_group>/', views.tabel_list, name='tabel_list'),
]`
`
пользователи/urls.py
from django.contrib.auth.views import (LoginView, LogoutView,
PasswordResetView, PasswordChangeView,
PasswordChangeDoneView,
PasswordResetDoneView,
PasswordResetConfirmView,
PasswordResetCompleteView
)
from django.urls import path
from . import views
app_name = 'users'
from django.contrib.auth.views import (LoginView, LogoutView,
PasswordResetView, PasswordChangeView,
PasswordChangeDoneView,
PasswordResetDoneView,
PasswordResetConfirmView,
PasswordResetCompleteView
)
from django.urls import path
from . import views
app_name = 'users'
urlpatterns = [
path('signup/', views.SignUp.as_view(), name='signup'),
path(
'logout/',
LogoutView.as_view(
template_name='users/logged_out.html'),
name='logout'
),
path(
'login/',
LoginView.as_view(
template_name='users/login.html'),
name='login'
),
path(
'password_change/',
PasswordChangeView.as_view(
template_name='users/password_change_form.html'
),
name='password_change'
),
path(
'password_change/done',
PasswordChangeDoneView.as_view(
template_name='users/password_change_done.html'
),
name='password_change_done'
),
path(
'password_reset/',
PasswordResetView.as_view(
template_name='users/password_reset_form.html'
),
name='password_reset'
),
path(
'password_reset/done/',
PasswordResetDoneView.as_view(
template_name='users/password_reset_done.html'
),
name='password_reset_done'
),
path(
'reset/<uid64>/<token>/',
PasswordResetConfirmView.as_view(
template_name='users/password_reset_confirm.html'
),
name='password_reset_confirm'
),
path(
'reset/done>/',
PasswordResetCompleteView.as_view(
template_name='users/password_reset_complete.html'
),
name='password_reset_complete'
),
]
модели.py
class Group(models.Model):
group_name = models.CharField(
verbose_name='Название группы',
max_length=15,
)
institute_name = models.CharField(
verbose_name='Название института',
max_length=50,
)
institute_name_short = models.CharField(
verbose_name='Краткое название института',
max_length=20,
)
slug = models.SlugField(
verbose_name='slug группы',
unique=True,
)
def __str__(self):
return self.group_name
class Student(models.Model):
student_id = models.ForeignKey(
User,
on_delete=models.CASCADE,
verbose_name='ID студента',
related_name='student_id'
)
group = models.ForeignKey(
Group,
on_delete=models.CASCADE,
related_name='group_id',
verbose_name='Группа',
)
form_training = models.CharField(
verbose_name='Форма обучения',
max_length=20,
choices=FORM_TRAINING_LIST,
default='PAID',
)
last_name = models.CharField(
verbose_name='Фамилия',
max_length=20,
)
def __str__(self):
return f'{self.student_id}'
class Meta:
verbose_name = 'Студент'
verbose_name_plural = 'Студенты'
Связь путь('группы//', views.tabel_list, name='table_list'), работает нормально (доступно только для авторизованных пользователей). Я не понимаю, в чем может быть проблема, так как slug_group не передается в ссылке для смены пароля. Я видел много ответов на эту ошибку, но я не могу применить это к своему проекту.
@ruddra Добавлены модели, может проблема в них
Речь идет не о моделях, а о реальных данных, хранящихся в таблицах. Не все ваши пользователи являются учащимися, или не все учащиеся имеют ссылку на группу, или в некоторых группах отсутствует значение slug - если какое-либо из этих значений верно, появится ошибка. Также этот код есть в шаблоне header
, я думаю, он включен во многие другие шаблоны. Это означает, что все представления, предоставляющие данные для этих шаблонов, должны предоставлять значение student
. Если их нет - появится ошибка.
Я подозреваю, что вы используете header.html
во многих шаблонах, и не во всех этих шаблонах есть контекстная переменная с именем student
. Следовательно, вы можете создать собственный обработчик контекста следующим образом:
#context_processors.py
from .models import Student
def student(request):
"""
The context processor must return a dictionary.
"""
if request.user.is_authenticated:
stdnt = Student.objects.get(student_id__username=request.user.username)
else:
stdnt = None
return {'student':stdnt}
Наконец, добавьте его в настройки:
#settings.py
TEMPLATES = [
{
#under OPTIONS key
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
#context processor written by us.
'appname.context_processors.student'
],
},
},
]
Я предполагаю, что экземпляр
Student
не содержит никакого значения дляgroup
или эта группа не имеет слагов. Вы должны проверить БД.