同时验证两个字段

2024-01-03

我正在看这篇文档:

清理和验证相互依赖的字段 https://docs.djangoproject.com/en/stable/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other

该文档解释了如何完成字段依赖,但我有一个稍微不同的问题:

假设我有一个包含两个字段的模型:

class MyModel(models.Model):
    field1 = models.CharField(max_length=200)
    field2 = models.CharField(max_length=200)

并假设两个字段之一是隐藏的,因此模型形式如下所示:

class MyModelForm(forms.ModelForm):
    class Meta:
        ...

        widgets = {'field2': forms.HiddenImput()}

现在,当用户填写表单时,我然后(在clean_field1) 还填写field2。现在,我想报告发生的任何错误field2作为一个错误field1。这是因为此时用户并不知道自己做错了什么!

我试图做的是,在 ModelForm 定义中:

def clean(self):
    cleaned_data = super(MyModelForm, self).clean()
    # Do something here
    return cleaned_data

因为这是 Django 页面上显示的内容。然而,问题是,当clean方法执行后,字典self.errors空空如也,不知道该怎么办……


我不确定我的答案。但是,我们假设您正在使用field1数据以便生成field2价值。您可以使用自定义方法生成它并将其分配给__init__方法。这将为您提供稍后清理这两个字段的好方法。

class MyModelForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(MyModelForm, self).__init__(*args, **kwargs)

        # now lets generate field2 data using field1 data.. 
        self.data['field2'] = self.field[1] * 154220

    class Meta:
        widgets = {'field2': forms.HiddenInput()}    


    def clean_field1(self):
        ## Here you can do validation for field1 only.
        ## Do it like field2 is not exisited. 


    def clean_field2(self):
        ## Here you can do validation for field2 only.
        ## Do it like field1 is not exisited. 

    def clean(self):
        """
        In here you can validate the two fields
        raise ValidationError if you see anything goes wrong. 
        for example if you want to make sure that field1 != field2
        """
        field1 = self.cleaned_data['field1']
        field2 = self.cleaned_data['field2']

        if field1 == field2:
            raise ValidationError("The error message that will not tell the user that field2 is wrong.")

        return self.cleaned_data

Update

如果您想要clean在特定字段中引发错误的方法:

请注意,由 Form.clean() 覆盖引发的任何错误都不会被 与任何特定领域相关。他们进入一个特殊的 “场”(称为all),您可以通过以下方式访问 如果需要的话,non_field_errors() 方法。如果你想附加错误 对于表单中的特定字段,您需要调用add_error()。

所以从 Django 文档中你可以使用add_error()做你想达到的目标。

代码可以是这样的

def clean(self):
    """
    In here you can validate the two fields
    raise ValidationError if you see anything goes wrong. 
    for example if you want to make sure that field1 != field2
    """
    field1 = self.cleaned_data['field1']
    field2 = self.cleaned_data['field2']

    if field1 == field2:
        # This will raise the error in field1 errors. not across all the form
        self.add_error("field1", "Your Error Message")

    return self.cleaned_data

请注意,上述方法是 Django 1.7 及更高版本中的新方法。

https://docs.djangoproject.com/en/dev/ref/forms/api/#django.forms.Form.add_error https://docs.djangoproject.com/en/dev/ref/forms/api/#django.forms.Form.add_error

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

同时验证两个字段 的相关文章

随机推荐

  • Android 多实例

    我在android中的通知中遇到问题 每当我单击通知时 我都必须再次调用相同的活动 但据我认为新的活动被调用 但前一个活动也在后端运行 因为我的代码一次又一次地运行 因为有多个实例 请帮助我如何在每次单击通知时解决或关闭多个实例 code
  • 当文档窗口在 Visual Studio 中获得焦点时发生的事件

    我在 Visual Studio 中有一个可扩展性项目 我需要使用当我在 Visual Studio 编辑器中从一个窗口更改为另一个窗口时触发的事件 我的问题是 我创建了一个显示一些图表的工具窗口 该图表依赖于一个可编辑文件 当我保存可编辑
  • Nestjs同时设置http和https服务器

    我正在尝试设置 http 和 https 服务器 咨询了官方文件 https docs nestjs com faq multiple servers nest i System Information OS Version Windows
  • 可从同一类的另一个实例访问私有字段[重复]

    这个问题在这里已经有答案了 我没有得到以下信息 我一直认为我只能从声明该字段的类访问私有字段 但是在这种情况下我可以访问它 class Session List
  • 子类化用户控制的 GridView

    我正在尝试对位于 UserControl 中的 GridView 进行子类化 因此 我希望能够在单独的页面中处理事件 基本上我的代码如下 我的带有 GridView 的 UserControl div div
  • 二分查找,从 java 到 Actionscript

    我正在尝试将以下 java 二进制搜索例程转换为 as3 我假设 compareTo 是内置的java方法 而 gt gt gt 是一种按位运算 任何熟悉 ActionScript 3 和 Java 的人都可以帮忙解决这个问题吗 packa
  • Excel 单元格值被 OLEDB 提供程序截断

    我正在使用 OleDbConnection 类从 Excel 2000 2003 工作簿检索数据 string connectionString Provider Microsoft Jet OLEDB 4 0 Data Source fi
  • 为什么垂直滚动条会自动移动?

    例如 我不明白为什么当单击 Line 9 时垂直滚动条会自动移动到最顶部位置 进一步单击不会移动滚动条 谁能解释为什么以及如何解决这个问题 我使用 Firefox 3 6 3 HTML div div
  • Fortran 中对多个矩阵进行加权和求和的最有效方法

    我正在尝试用 Fortran 编写一个函数 将多个具有不同权重的矩阵相乘 然后将它们加在一起形成一个矩阵 我已经确定这个过程是我的程序的瓶颈 这个权重将被many程序单次运行的时间 具有不同的权重 现在我正试图通过从 Matlab 切换到
  • 找不到项目文件

    我有一个现有的 TFS 项目 其结构与此类似 我在框架目录中创建了一个包含 2 个项目的解决方案 然后 我将 Cerberus 和 Cerberus Mvc 作为现有项目添加到 OnFaitQuoi 解决方案中 请注意 之前已签入 cerb
  • SSH.NET 从 ShellStream 检索输出

    我是 SSH NET 的新手 我正在我目前正在进行的一个项目中使用它 我必须使用 SSH NET 运行 sudo 命令 这就是我使用 ShellStream 运行该命令并为 sudo 命令提供身份验证的原因 现在我尝试运行 sudo 命令
  • 链接到完整的 div - html 和 css

    一些文字 sliderPart width 25 height 100 sliderPart a display block position relative text decoration none height 100 font 1
  • 如何将 BIT2 类型链接到变量?

    In most input cardsBeckhoff 有两个变量 Limit 1 and limit 2 他们有个BIT2datatype 大小为0 2字节 即有两位 如下图所示Limit 1 Bit0 Value smaller equ
  • 如何使用 python 在 Tensorboard 上显示模型的权重和偏差

    我创建了以下模型进行训练 并希望在 Tensorboard 上将其可视化 Basic Cell LSTM tensorflow index in epoch 0 perm array np arange x train shape 0 np
  • 正则表达式在页面上查找两个单词

    我试图找到包含单词 text1 和 text2 的所有页面 我的正则表达式 text1 n text2 it doesn t work 如果您的 IDE 支持s 单线 标志 所以 字符可以匹配换行符 您可以使用以下方式搜索您的项目 text
  • 在VBA中逐像素扫描图像

    这里有一个近乎精确的问题读取图像的像素颜色 https stackoverflow com questions 16528319 read pixel colors of an image 实际上 Op 提出的问题与我所问的问题相同 但接受
  • Android - 用于语音识别的外部 MIC

    我需要知道将麦克风或耳机连接到设备时会触发哪个事件 并且我正在使用语音识别 并且观察到它不会遵循与设备未连接任何设备时相同的流程 我想知道是否有某种解决方案 因为我目前正在创建的应用程序是在智能手机中进行测试的 但将来需要连接麦克风或耳机
  • 使用 Moment,js 获取本月所有星期一日期

    有没有办法使用 moment js 库获取当月的所有星期一日期 我知道我可以通过以下方式得到月底 moment endOf month 但如何获取当前 任何月份的所有星期一日期 我不想要 javascript 默认日期库中的某些函数 请参考
  • 如何在功能组件中更改父组件的子状态组件

    我创建了一个倒计时器组件 我在这个组件附近有一个按钮 我希望当用户单击此按钮时重置计时器 为此我应该改变子状态 我找到了从孩子那里改变父母状态的解决方案 但我找不到解决方案 可以用ref解决吗 我的计时器组件是一个功能组件 React re
  • 同时验证两个字段

    我正在看这篇文档 清理和验证相互依赖的字段 https docs djangoproject com en stable ref forms validation cleaning and validating fields that de