【问题标题】:Django custom validation on formsets表单集上的 Django 自定义验证
【发布时间】:2011-05-04 03:58:26
【问题描述】:

我正在寻找一些关于如何对表单集进行自定义验证的建议。

这就是我现在所拥有的,它返回以下我不完全知道如何处理的错误。

Exception Value: 
'MilestoneFormFormSet' object has no attribute 'save'

Forms.py

class BaseMilestoneFormSet(BaseFormSet):

    def clean(self):
        for form in self.forms:
            data = form.cleaned_data
            target_date = data["target_date"]
            project = data["project"]
            if target_date > project.target_date:
                raise forms.ValidationError("Target Date is outside of project target date")
            return data

MilestoneFormSetNew = modelformset_factory(Milestone, formset=BaseMilestoneFormSet, max_num=50, extra=1)

Views.py 摘录

if request.method == 'POST':  # Loop through the submitted formsets check for erros and save the data.
        formsetNew = MilestoneFormSetNew(request.POST, prefix='new')
        if formsetNew.is_valid():
            formsetNew.save()
            return HttpResponseRedirect(reverse('pooflinger.project.views.detail', args=(project.id,)))

【问题讨论】:

    标签: django validation formsets


    【解决方案1】:

    您的 clean 方法中有一个缩进错误 - 返回值应该在 for 循环之外。

    但不要在表单集中进行这种类型的验证。当您在表单集中的表单中进行验证时,表单集验证很有用。您正在比较每个表单中的值,因此为表单集使用自定义 ModelForm 更有意义。

    class MilestoneForm(forms.ModelForm):
    
        def clean(self):
            data = self.cleaned_data
            target_date = data["target_date"]
            project = data["project"]
            if target_date > project.target_date:
                raise forms.ValidationError("Target Date is outside of project target date")
            return data
    
    MilestoneFormSetNew = modelformset_factory(Milestone, form=MilestoneForm, max_num=50, extra=1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-02
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 2018-02-08
      • 2021-06-22
      相关资源
      最近更新 更多