form.is_valid()为false时如何访问数据

时间:2009-04-09 19:16:03

标签: python django forms formset cleaned-data

当我有一个有效的Django表单时,我可以使用form.cleaned_data访问数据。但是,当表单无效时,如何获取用户输入的数据,即form.is_valid为false。

我正在尝试访问表单集中的表单,因此form.data似乎只是让我一团糟。

7 个答案:

答案 0 :(得分:42)

您可以使用

form.data['field_name']

这样您就可以获得分配给该字段的原始值。

答案 1 :(得分:17)

请参阅http://docs.djangoproject.com/en/dev/ref/forms/validation/#ref-forms-validation

  

其次,一旦我们决定了   我们在两个领域的综合数据   正在考虑无效,我们必须   记得从中删除它们   cleaned_data。

     

事实上,Django目前会   彻底清除cleaning_data   字典,如果有任何错误   表格。但是,这种行为可能会   改变未来,所以它不是一个   在你自己之后清理的坏主意   第一名。

原始数据始终位于request.POST


评论表明,重点是做一些听起来更复杂的字段级验证。

每个字段都有未经验证的数据,并返回有效数据或引发异常。

在每个字段中,可以对原始内容进行任何类型的验证。

答案 2 :(得分:13)

我正在努力解决类似的问题,并在这里遇到了一个很好的讨论:https://code.djangoproject.com/ticket/10427

根本没有详细记录,但对于实时表单,您可以使用以下内容查看字段的值(如窗口小部件/用户所示):

form_name['field_name'].value()

答案 3 :(得分:8)

我有很多方法。你可以选择所有。

我认为表格如下:

class SignupForm(forms.Form):
    email = forms.CharField(label='email')
    password = forms.CharField(label='password',
                               widget=forms.PasswordInput)

1-1。从request

获取
def signup(req):
    if req.method == 'POST':
        email = req.POST.get('email', '')
        password = req.POST.get('password', '')

2-1。获取分配给该字段的raw value并返回字段<{1}}属性的值

data

2-2。获取分配给该字段的原始值,并返回字段

def signup(req): if req.method == 'POST': ... sf = SignupForm(req.POST) email = sf["email"].data password = sf["password"].data ... 属性的值
value

2-3。获取分配给字段的def signup(req): if req.method == 'POST': ... sf = SignupForm(req.POST) email = sf["email"].value() password = sf["password"].value() ...

dictionary

答案 4 :(得分:5)

您可以使用此模式:

class MyForm(forms.Form):
    ...
    def clean(self):
        self.saved_data=self.cleaned_data
        return self.cleaned_data

在您的代码中:

if form.is_valid():
    form.save()
    return django.http.HttpResponseRedirect(...)
if form.is_bound:
    form.saved_data['....'] # cleaned_data does not exist any more, but saved_data does.

使用form.data不是一个好的解决方案。原因:

  • 如果表单有前缀,则字典键将以此前缀为前缀。
  • 不清除form.data中的数据:只有字符串值。

答案 5 :(得分:3)

我使用formset遇到了类似的问题。在我的示例中,我希望用户在第二个选择之前选择第一个选项,但如果第一个选项遇到另一个错误,则还会显示“在第二个选择之前选择第一个选项”错误。

要获取第一个字段的未清除数据,我在表单字段的清理方法中使用了它:

dirty_rc1 = self.data[self.prefix + '-reg_choice_1']

然后,我可以测试该字段中是否存在数据:

if not dirty_rc1:
    raise ValidationError('Make a first choice before second')

希望这有帮助!

答案 6 :(得分:1)

您可以从字段的clean()方法或表单的clean()方法访问数据。 clean()是确定表单是否有效的函数。调用is_valid()时调用它。在表单的clean()中,当您可以运行自定义代码以确保全部签出时,您有cleaned_data列表。在窗口小部件中,您还有一个clean(),但它使用单个传递的变量。为了访问字段的clean()方法,你必须将它子类化。 e.g:

class BlankIntField(forms.IntegerField):
    def clean(self, value):
        if not value:
            value = 0
        return int(value)

例如,如果你想要一个没有扼杀空值的IntField,你可以使用上面的内容。

表单上的clean()类似:

def clean(self):
    if self.cleaned_data.get('total',-1) <= 0.0:
        raise forms.ValidationError("'Total must be positive")
    return self.cleaned_data

此外,您可以为每个字段设置clean_FIELD()函数,以便您可以单独验证每个字段(在调用字段的clean()之后)