передайте два из pk в url

#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 используется для добавления дополнительных данных в контекст шаблона