Django получает доступ к PK / объекту в URL

#django #forms #django-views

#django #формы #django-представления

Вопрос:

У меня есть два класса — event и round. Раунд имеет ограничение внешнего ключа для события, поэтому раунд привязан к событию.

Теперь, чтобы создать раунд, у меня есть следующий маршрут

 <slug:slug_event>/new/
  

И для доступа к раунду

 <slug:slug_event>/<int:pk_round>/
  

Чтобы сохранить раунд, мне нужно объявить событие. Итак, в моем round/views.py У меня есть

 fields = [..., 'event']
  

и я могу выбрать событие, к которому будет привязан раунд.
Но я бы хотел не иметь этого поля события, потому что событие уже указано в URL.
Итак, я бы хотел что-то вроде

 class RoundCreateView(CreateView):
    model = Round
    pk_url_kwarg = 'pk_round'
    fields = [...]

    def form_valid(self, form):
        form.instance.event = self.request.event #obviously this dosn't work
        return super().form_valid(form)
  

поэтому мне не нужно указывать событие «дважды».

Ответ №1:

Вы можете извлечь событие из базы данных, используя slug из URL-адреса:

 def form_valid(self, form):
    event = get_object_or_404(Event, slug=self.kwargs['slug_event'])
    form.instance.event = event
    return super().form_valid(form)
  

Теперь вы можете удалить `событие» из полей формы.

Обратите внимание, что get_object_or_404 будет отображаться страница 404, если событие не существует. Возможно, вы захотите также сделать get_object_or_404 для запросов GET, чтобы пользователь не заполнял форму для недопустимого slug-файла, а затем не получал ошибку 404.