我试图向表单添加一些额外的验证来覆盖它的干净方法,但错误不会引发,一个 ValueError 异常说“视图 apps.orders.views.view 没有返回 HttpResponse 对象。它返回 None反而。”相反,如果我在 if 条件中创建一个 else 子句来检查表单是否有效并打印 form.errors ,它将打印在 clean 方法中创建的错误。作为记录,我将表单与表单集一起使用。预先感谢。
这里的表格:
class OrderForm(forms.ModelForm):
"""ModelForm Class for Orders objects."""
class Meta:
model = Order
fields = '__all__'
widgets = {
'executor_signature_date': forms.DateInput(
format=('%Y-%m-%d'),
),
'customer_signature_date': forms.DateInput(
format=('%Y-%m-%d'),
),
}
def clean(self):
cleaned_data = super().clean()
check_diagnosis = cleaned_data.get("check_diagnosis")
repair = cleaned_data.get("repair")
install = cleaned_data.get("install")
maintenance = cleaned_data.get("maintenance")
if (not check_diagnosis) and (not repair) and (not install) and (not maintenance):
self.add_error(None, "At least one modality option must be checked.")
else:
return cleaned_data
check_diagnosis、repair、install和maintenance字段是BooleanField。
这里的观点:
def post(self, request, **kwargs):
order = Order.objects.get(pk=kwargs['pk'])
form = self.form_class(request.POST, instance=order)
ItemTimesFormSet = modelformset_factory(ItemTimes, exclude=['order'])
formset = ItemTimesFormSet(request.POST)
if form.is_valid() and formset.is_valid():
order.items.clear()
form.save()
for form in formset:
if form.cleaned_data.get('item'):
item = form.cleaned_data.get('item')
times = form.cleaned_data.get('times')
ItemTimes.objects.create(
order=order,
item=item,
times=times
)
return redirect(self.success_url)
当表单无效时,您不会返回任何特定错误,只需像这样更新您的视图即可处理表单中的错误:
def post(self, request, **kwargs):
order = Order.objects.get(pk=kwargs['pk'])
form = self.form_class(request.POST, instance=order)
ItemTimesFormSet = modelformset_factory(ItemTimes, exclude=['order'])
formset = ItemTimesFormSet(request.POST)
if form.is_valid() and formset.is_valid():
order.items.clear()
form.save()
for form in formset:
if form.cleaned_data.get('item'):
item = form.cleaned_data.get('item')
times = form.cleaned_data.get('times')
ItemTimes.objects.create(
order=order,
item=item,
times=times
)
return redirect(self.success_url)
else:
# Form is not valid, handle the error
print(form.errors) # Optional: Print the form errors for debugging
# Provide an appropriate response, such as rendering the form again with the errors
context = {
'form': form,
'formset': formset,
}
return self.render_to_response(context)
而且最好在表单中添加错误,如下所示:
from django.core.exceptions import ValidationError
def clean(self):
cleaned_data = super().clean()
check_diagnosis = cleaned_data.get("check_diagnosis")
repair = cleaned_data.get("repair")
install = cleaned_data.get("install")
maintenance = cleaned_data.get("maintenance")
if (not check_diagnosis) and (not repair) and (not install) and (not maintenance):
raise ValidationError("At least one modality option must be checked.")
return cleaned_data