首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django modelform根据其他字段选择删除“必需”属性

Django modelform根据其他字段选择删除“必需”属性
EN

Stack Overflow用户
提问于 2011-08-17 20:10:53
回答 3查看 6.6K关注 0票数 7

我有几个字段的ModelForm。有些字段是必填的,有些则不是。此外,我有不同的选择选择字段,我想使一些字段“必填”或不基于这个选择字段的选择。

我尝试了表单的clean()方法

代码语言:javascript
复制
def clean(self):
    cleaned_data = self.cleaned_data
    some_field = cleaned_data.get("some_field")
    if some_field == 'some_value':
          self.fields['other_field'].required = False
    return cleaned_data

但它不起作用

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-17 21:51:34

请参阅Cleaning and validating fields that depend on each other上的Django文档。标准做法是改为执行以下处理:

代码语言:javascript
复制
def clean(self):
    cleaned_data = self.cleaned_data
    some_field = cleaned_data.get("some_field")
    if some_field == 'some_value':
          # 'other_field' is conditionally required.
          if not cleaned_data['other_field']:
              raise forms.ValidationError("'Other_field' is required.")
    return cleaned_data
票数 10
EN

Stack Overflow用户

发布于 2011-08-17 21:33:52

您的想法是正确的,但问题是,在清除表单之前,各个字段验证已经运行。你有几个选择。您可以将该字段设置为非必填字段,并处理form.clean中何时需要该字段的逻辑。或者,您可以将该字段保留为必填字段,并删除它可能在clean中引发的验证错误。

代码语言:javascript
复制
def clean(self):
    cleaned_data = self.cleaned_data
    some_field = cleaned_data.get("some_field")
    if some_field == 'some_value':
          if 'other_field' in self.errors:
              del self.errors['other_field']
              cleaned_data['other_field'] = None
    return cleaned_data

这有一些问题,因为它删除了所有错误,而不仅仅是缺少/必需的错误。cleaned_data也有一个问题。您现在有了一个必填字段,该字段不在cleaned_data中,这就是我将其添加为None的原因。应用程序的其余部分将不得不处理这种情况。有一个没有值的必填字段可能看起来很奇怪。

票数 3
EN

Stack Overflow用户

发布于 2012-07-19 22:36:59

如果您想以常用方式打印必填字段的错误信息,您可以这样做:

代码语言:javascript
复制
def clean(self):
    cleaned_data = super(PasswordChangeForm, self).clean()
    token = cleaned_data.get('token')
    old_password = cleaned_data.get('old_password')
    if not token and not old_password:
        self._errors['old_password'] = self.error_class([self.fields['old_password'].error_messages['required']])
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7092536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档