【问题标题】:Conditional Field/Form Validation using Django使用 Django 进行条件字段/表单验证
【发布时间】:2014-09-02 16:38:00
【问题描述】:

我正在尝试使用 django 创建一个条件字段。 “已批准”是一个复选框,“Date_of_approval”是一个日期字段。 “Member”是定义“clean”方法的类。

一旦选中了已批准的字段,我希望日期字段成为必填字段。 我使用下面的代码得到的错误是 'NoneType' object has no attribute 'get'

还请帮助我确认此代码的放置位置。我在我的模型页面中有它。每当我将其放入表单页面时,它都无法识别这些字段。

approved = models.BooleanField()
date_of_approval = models.DateField(blank=True, null=True,)   

def clean(self):
    cleaned_data = super(Member, self).clean()
    approved = cleaned_data.get("approved")
    date_of_approval = cleaned_data.get("date_of_approval ")

    if approved and date_of_approval :

        if approved and not date_of_approval :
            raise forms.ValidationError("Invaid input")
    return self.cleaned_data

【问题讨论】:

标签: python django


【解决方案1】:

cleaned_data 用于表单验证,而不是模型验证。要在模型验证期间获取清理后的字段值,只需引用self

from django.core.exceptions import ValidationError

...

class Member(models.Model):

    # field definitions as above

    def clean(self):
        if self.approved and not self.date_of_approval:
            raise ValidationError("Approved members must have a date of approval")

或者修复您的表单,以便它找到有问题的字段,但您的问题中没有足够的信息来说明您为什么会遇到问题。

【讨论】:

  • 感谢@peter 的回答。事实是我什至不知道为什么我的表单在识别字段时遇到问题。您知道表单无法识别字段的任何原因吗?
  • 它现在可以工作了。我不得不将代码包含在另一个类中,因为每当我将它放在它自己的类中时它都不起作用。
  • 一方面,这不是魔法 - 如果您的表单不起作用,那么您声明它的方式有问题。另一方面,我不会坐在这里猜测实际上可能有无数种可能的错误,而这些错误可能是在没有看到代码的情况下发生的。
  • 我在问题中编写的初始代码中声明它的方式与我声明它的方式相同。大约有29274878734行代码,我只尝试复制相关部分。没有其他与字段相关的内容。 @彼得
  • 我需要看看你是如何声明你的表单类的,例如它是一个ModelForm 还是一个普通的Form?如果是模型形式,Meta 内部类是什么?如果是普通的Form,你声明了哪些字段?等等。提到不确定将代码放在哪个“页面”中,这听起来像是您对表单和模型之间的区别有点不确定。但在这个问题之后,这似乎不是一个富有成效的讨论领域。
猜你喜欢
  • 2016-07-16
  • 1970-01-01
  • 2014-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多