#python #django
Вопрос:
Если значение «учебный год» изменено, 404 не отображается. Я хочу, чтобы данные отображались только тогда, когда и «school_year», и «pk» имеют правильные значения в URL.
например, если у вас есть данные, которые (School_Year = 2020, pk = 33) при вводе URL https://190.0.1/190/190/33 и https://190.0.1/190/whatthell/33 Оба результата одинаковы.
Однако я хотел бы отображать результат только в том случае, если оба значения верны.
я действительно не знаю, правильно ли я объяснил, спасибо.
view.py
class StudentDetail(DetailView,FormView):
model = Student
template_name = 'student/member.html'
context_object_name = 'student'
form_class = AddConsultation
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['pk'] = Student.objects.filter(pk=self.kwargs.get('pk'))
return context
url.py
path('student/<school_year>/<pk>/', views.StudentDetail.as_view(), name='student_detail'),
html ссылка
<a href='{% url 'student_detail' student.school_year student.pk %}'>
models.py
class Student(models.Model):
school_year = models.CharField(
max_length=10,
choices=SCHOOL_YEAR_CHOICES,
default='2021N',
verbose_name='school year'
)
... etc
Ответ №1:
Я бы удалил get_context_data
и переопределил get_object
с помощью get_object_or_404
:
class StudentDetail(DetailView, FormClass):
model = Student
template_name = 'student/member.html'
context_object_name = 'student'
form_class = AddConsultation
def get_object(self, queryset=None):
return get_object_or_404(Student, pk=self.kwargs['pk'], school_year=self.kwargs['school_year'])
Другим решением может быть:
class StudentDetail(DetailView, FormClass):
model = Student
template_name = 'student/member.html'
context_object_name = 'student'
form_class = AddConsultation
slug_field = 'school_year'
slug_url_kwarg = 'school_year'
query_pk_and_slug = True
но я нахожу первый менее волшебным 🙂
Комментарии:
1. ваше здоровье! это работает. в чем разница между get_context_data и get_object?
2. get_object используется для заполнения переменной объекта в шаблоне, get_context_data используется для добавления дополнительных данных в контекст шаблона