【问题标题】:Invalid Django form无效的 Django 表单
【发布时间】:2012-03-02 01:22:30
【问题描述】:

我有一个未通过is_valid() 测试的表单。我创建了一个相同的表单,它使用相同的数据输入通过了测试。不知道为什么一个会通过,一个会失败。

以下是表格:

choices = ( (1,'Yes'),(0,'No'),
      )

class ActivitySaveForm(forms.Form):
    name = forms.CharField(
        label=u'Activity Name',
        widget=forms.TextInput(attrs={'size': 64})
    )
    url = forms.URLField(
        label=u'URL',
        widget=forms.TextInput(attrs={'size': 64})
    )
    desc = forms.CharField(
        label=u'Describe it',
                widget=forms.TextInput(attrs={'size': 250})
    )
    created = forms.DateField(
        label=u'Date Entered',initial=datetime.date.today,
    )
    priority = forms.CharField(
        label=u'priority: 1-5',
            widget=forms.TextInput(attrs={'size': 1})
    )
    difficulty = forms.CharField(
        label=u'How hard is it? 1-5',
            widget=forms.TextInput(attrs={'size': 1})
    )
    done = forms.TypedChoiceField(choices=choices, widget=forms.RadioSelect, coerce=int
    )   
    tags = forms.CharField(
        label=u'Tags',required=False,
            widget=forms.TextInput(attrs={'size': 64})
    )
#def __init__(self, *args, **kwargs):
    #super(CircuitForm, self).__init__(*args, **kwargs)

    #for key in self.fields:
        #self.fields[key].required = False


class AcTest(forms.Form):
    name = forms.CharField(
        label=u'Activity Name',
        widget=forms.TextInput(attrs={'size': 64})
    )
    url = forms.URLField(
        label=u'URL',
        widget=forms.TextInput(attrs={'size': 64})
    )
    desc = forms.CharField(
        label=u'Describe it',
                widget=forms.TextInput(attrs={'size': 250})
    )
    created = forms.DateField(
        label=u'Date Entered',initial=datetime.date.today,
    )
    priority = forms.CharField(
        label=u'priority: 1-5',
            widget=forms.TextInput(attrs={'size': 1})
    )
    difficulty = forms.CharField(
        label=u'How hard is it? 1-5',
            widget=forms.TextInput(attrs={'size': 1})
    )
    done = forms.TypedChoiceField(choices=choices, widget=forms.RadioSelect, coerce=int
    )   
    tags = forms.CharField(
        label=u'Tags',required=False,
            widget=forms.TextInput(attrs={'size': 64})
    )

这是测试和两者的结果。

>>> data = {'name':'test',
...         'url': 'www.test.com',
...         'desc':'test desc',
...         'created': '01/01/1900',
...         'priority':1,
...         'difficulty':1,
...         'desc':'test desc',
...         'tags':'test desc'}
>>> f=ActivitySaveForm(data)
>>> f.is_valid()
False
>>> f=AcTest(data)
>>> f.is_valid()
True

不确定如何进一步诊断此错误,也没有找到使其正常工作的方法。感谢您在这方面的帮助。

【问题讨论】:

    标签: python django-forms


    【解决方案1】:

    我运行了您的代码,对我来说,两种表单都无法验证。您可以这样做:print f.errors,您将获得验证期间创建的错误消息的 HTML。

    为此我得到:

    <ul class="errorlist"><li>done<ul class="errorlist"><li>This field is required.</li></ul></li></ul>

    换句话说,您没有为“完成”字段指定值,即使它是必需的。将 'done':1 添加到 data 字典后,表单就会验证。

    至于为什么一个表单被验证而另一个不被验证...我将所有这些粘贴到一个单独的小程序中,您可能会发现它们的行为方式相同。我只能推测由于某种原因您在两种情况下都没有真正传递相同的数据。或者当你运行测试时,表格有细微的差别。但我不能确定。

    无论如何,尝试打印错误,您应该会有所了解。

    【讨论】:

    • 感谢 jbrendel。尴尬的。这就是问题所在。
    【解决方案2】:

    您应该能够检查表单错误。像这样的东西可能会让你看到错误。 (抱歉,这是未经测试的)

    https://docs.djangoproject.com/en/dev/topics/forms/#customizing-the-form-template

    >>> f = ActivitySaveForm(data)
    >>> f.non_field_errors()
    >>> field_errors = [ (field.label, field.errors) for field in f] 
    

    【讨论】:

      猜你喜欢
      • 2013-09-14
      • 2020-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-05
      • 2021-07-26
      • 2017-04-27
      相关资源
      最近更新 更多