无法使用django Form.clean()方法

问题描述 投票:0回答:1

我试图向表单添加一些额外的验证来覆盖它的干净方法,但错误不会引发,一个 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)
django django-forms
1个回答
0
投票

当表单无效时,您不会返回任何特定错误,只需像这样更新您的视图即可处理表单中的错误:

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
© www.soinside.com 2019 - 2024. All rights reserved.