django - FormSet:ingore形式只包含初始值

时间:2016-06-08 20:30:08

标签: python django django-forms formset

我有一个FormSet,每个表单都包含一个带有初始值的文件:

class IssueForm(forms.Form):

    date_of_issue = forms.DateField(
            initial=date.today().strftime("%d.%m.%Y"),
            widget=forms.TextInput(attrs={
                'placeholder': date.today().strftime("%d.%m.%Y"),
                'class': 'form-control',
            }),
            localize=True,
            required=True)

现在,用户显示了10个额外的表单,但也许他/她只填写其中的5个。现在,字段date_of_issue是必需的,因此在提交formSet之后,它将再次显示并标记用户未填充的那5行。

我尝试为该字段添加自己的清理功能,但我不知道这是否可行:

def clean_date_of_issue(self):
    if len(self.cleaned_data) == 1 and 'date_of_issue' in self.cleaned_data:
        self.cleaned_data = dict()
        return None
    return self.cleaned_data['date_of_issue']

1 个答案:

答案 0 :(得分:0)

Thx @håken-lid将我推入代码。我应该首先做到这一点。

最后我不知道诀窍是什么。我已经覆盖了大多数清理函数,并在验证级别检查错误(阅读docs。它有帮助!)

有一件事是show_hidden_​​initial。表单似乎有必要认识到初始值没有改变:

class IssueForm(forms.Form):
    # ...

    date_of_issue = forms.DateField(
            initial=date.today().strftime("%d.%m.%Y"),
            show_hidden_initial=True,
            widget=forms.TextInput(attrs={
                'placeholder': date.today().strftime("%d.%m.%Y"),
                'class': 'form-control, datepicker',
            }),
            localize=True,
            required=True)

另一种方法是覆盖表单清理函数并删除错误(不是一个非常好的解决方案):

class IssueForm(forms.Form):
    # ...

    def clean(self):
        cleaned_data = super(IssueForm, self).clean()

        # get all non default fields
        not_default_fields = [value for key, value in cleaned_data.items() if key not in ('date_of_issue', 'issuer')]

        if any(not_default_fields) is False and 'value' in self.errors:
            # remove the error if it's the only one
            self.errors.pop('value')

        return cleaned_data

我不知道为什么它首先没有像预期的那样起作用,但现在确实......