Передача дополнительной информации в View
Я пытаюсь работать с Django формой более щадящим способом и на самом деле, я понятия не имею, как продвинуть эту тему дальше. У меня есть View, который отвечает за отображение формы, в условии If form.is_valid() я ищу бесплатные парковочные места, если я ничего не нашел, то я хотел бы показать пользователю ошибку или передать в контекст дополнительные данные. С первой частью я легко справился, но я понятия не имею как показать ошибку или что-то подобное.
class BookParkingSpot(FormMixin, generic.ListView):
template_name = 'parking/book_spot.html'
form_class = BookParkingSpotForm
model = ParkingBooking
def post(self, request, *args, **kwargs):
form = BookParkingSpotForm(self.request.POST)
if form.is_valid():
parking_spot_list = ParkingSpot.objects.all().exclude(
parkingbooking__booking_time_start__lte=form.instance.booking_time_end,
parkingbooking__booking_time_end__gte=form.instance.booking_time_start
)
if parking_spot_list.exists():
random_spot = random.choice(parking_spot_list)
reservation = ParkingBooking.objects.create(
car=form.instance.car,
booking_owner=self.request.user,
spot=random_spot,
booking_time_end=form.instance.booking_time_start,
booking_time_start=form.instance.booking_time_end,
)
return redirect(reservation.get_absolute_url())
else: # this part doesn't work
context = self.get_context_data(**kwargs)
return render(self.request, self.template_name, context)
Есть идеи, как его улучшить?
Простите всех за неудобства, но после публикации на StackOverflow я выяснил, как решить эту проблему, и это было очень просто, я все еще изучаю Django ;)
Итак, ответ на мой вопрос кроется в последней части моего кода, если я не нашел ни одного свободного парковочного места, то я могу отобразить ту же страницу с дополнительными данными, как показано в примере ниже, и передать объект формы контексту:
return render(self.request, 'parking/book_spot.html',
{'errors': "There are no free parking spots in selected time",
'form': form})
Лучше всего писать валидации в методах формы. Читайте об этом в: https://docs.djangoproject.com/en/4.0/ref/forms/validation/#validating-fields-with-clean
from django.core.exceptions import ValidationError
class BookParkingSpotForm(forms.Form):
# ...
def clean(self):
cleaned_data = super().clean()
p_list = ParkingSpot.objects.all().exclude(
parkingbooking__booking_time_start__lte=cleaned_data.booking_time_end,
parkingbooking__booking_time_end__gte=cleaned_data.booking_time_start
)
if p_list.count() == 0:
raise ValidationError('Your error message')
Для доступа к данным формы используйте form.cleaned_data['field_name'], а не form.instance.field_name.