django - FormSet:忽略仅包含初始值的表单
django - FormSet: ingore forms contaning only initial values
我有一个 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 个额外的表单,但可能 he/she 只填写其中的 5 个。现在字段 date_of_issue 是必需的,因此在提交表单集后它将再次显示并标记用户未填写的 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']
感谢@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
我不知道为什么一开始它没有像预期的那样工作,但现在它确实...
我有一个 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 个额外的表单,但可能 he/she 只填写其中的 5 个。现在字段 date_of_issue 是必需的,因此在提交表单集后它将再次显示并标记用户未填写的 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']
感谢@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
我不知道为什么一开始它没有像预期的那样工作,但现在它确实...