将附加信息传递给 View
Passing additional information to View
我正在尝试以更温和的方式处理 Django 表单,实际上,我不知道如何进一步推进这个主题。我有一个负责显示表单的视图,在 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)
知道如何改进吗?
很抱歉给大家带来不便,但在 Whosebug 上发帖后,我又想出了解决这个问题的方法,而且非常简单,我还在学习 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
。
我正在尝试以更温和的方式处理 Django 表单,实际上,我不知道如何进一步推进这个主题。我有一个负责显示表单的视图,在 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)
知道如何改进吗?
很抱歉给大家带来不便,但在 Whosebug 上发帖后,我又想出了解决这个问题的方法,而且非常简单,我还在学习 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
。