【问题标题】:Django: problems with urlfields validation when overriding form validationDjango:覆盖表单验证时的urlfields验证问题
【发布时间】:2019-03-06 13:22:57
【问题描述】:

我有一些带有两个 urlfields 的表单,两者都不是必需的。该表单用于从这两个 urlfields 中设置模型中 JSONField 的值(为了用户方便),一切正常。如果用户在 url1 或 url2 中输入了除 URL 之外的内容,django 会在“输入有效 URL”的表单中显示验证错误。

现在我想让用户在这些 urlfields 中的任何一个中输入 URL。我为此重写了 clean 方法:

class MyForm(forms.ModelForm):
    url1 = forms.URLField(required=False)
    url2 = forms.URLField(required=False)

    def clean(self):
        cleaned_data = super(MyForm, self).clean()
        if not cleaned_data['url1'] and not cleaned_data['url2']:
            raise ValidationError(
                _("You should enter at least one URL"),
                code='no_urls'
            )
        return cleaned_data

它可以工作,但是有一个问题:如果用户在 url1 或 url2 中输入一些“非 URL”数据并提交表单,Django 会引发 KeyError 异常值:'url1'(或 'url2')而不是显示表单验证错误

怎么了?谢谢!

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    正如在很多地方记录的那样 - 特别是 the part about cross validation -,cleaned_data 仅包含有效数据 - 未验证的字段不会显示在此处。您必须以一种或另一种方式来解释这一点 - 通过测试密钥是否存在,或者as shown in the cross-validation example snippet,使用dict.get()

    def clean(self):
        cleaned_data = super(MyForm, self).clean()
        # boolean algebra 101: "not A and not B" => "not (A or B)"
        if not (cleaned_data.get('url1') or cleaned_data.get('url2')):
            raise ValidationError(
                _("You should enter at least one URL"),
                code='no_urls'
            )
        return cleaned_data
    

    【讨论】:

    • 谢谢,布鲁诺!明白了,现在好了。哈哈@代数101,真的)))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    相关资源
    最近更新 更多