#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.