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

Gre*_*reg 48 python forms django cleaned-data formset

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

我正在尝试访问表单集中的表单,因此form.data似乎只是给我一个烂摊子.

Dmi*_*erg 44

您可以使用

form.data['field_name']
Run Code Online (Sandbox Code Playgroud)

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

  • @Fuad `form.data.get('field_name', None)` (2认同)

S.L*_*ott 17

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

其次,一旦我们确定我们正在考虑的两个字段中的组合数据无效,我们必须记住将它们从cleaning_data中删除.

事实上,如果表单中有任何错误,Django目前将完全清除cleaning_data字典.但是,这种行为将来可能会发生变化,因此首先要清理自己并不是一个坏主意.

原始数据始终可用request.POST.


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

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

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

  • 我认为OP意味着操作表单解析的内容会很好,即使它没有验证:form.phone_number会返回字段`phone_number`得到的任何值,无论它是否正确验证. (2认同)

小智 13

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

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

form_name['field_name'].value()
Run Code Online (Sandbox Code Playgroud)


Bur*_*ing 8

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

我想表格如下:

class SignupForm(forms.Form):
    email = forms.CharField(label='email')
    password = forms.CharField(label='password',
                               widget=forms.PasswordInput)
Run Code Online (Sandbox Code Playgroud)

1-1.从获得request

def signup(req):
    if req.method == 'POST':
        email = req.POST.get('email', '')
        password = req.POST.get('password', '')
Run Code Online (Sandbox Code Playgroud)

2-1.获取raw value分配给该字段并返回data字段属性的值

def signup(req):
    if req.method == 'POST':
        ...
        sf = SignupForm(req.POST)
        email = sf["email"].data
        password = sf["password"].data
        ...
Run Code Online (Sandbox Code Playgroud)

2-2.获取分配给该字段的原始值并返回value字段属性的值

def signup(req):
    if req.method == 'POST':
        ...
        sf = SignupForm(req.POST)
        email = sf["email"].value()
        password = sf["password"].value()
        ...
Run Code Online (Sandbox Code Playgroud)

2-3.获取dictionary分配给字段

def signup(req):
    if req.method == 'POST':
        ...
        sf = SignupForm(req.POST)
        # print sf.data
        # <QueryDict: {u'csrfmiddlewaretoken': [u'U0M9skekfcZiyk0DhlLVV1HssoLD6SGv'], u'password': [u''], u'email': [u'hello']}>
        email = sf.data.get("email", '')
        password = sf.data.get("password", '')
        ...
Run Code Online (Sandbox Code Playgroud)


gue*_*tli 5

您可以使用此模式:

class MyForm(forms.Form):
    ...
    def clean(self):
        self.saved_data=self.cleaned_data
        return self.cleaned_data
Run Code Online (Sandbox Code Playgroud)

在你的代码中:

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.
Run Code Online (Sandbox Code Playgroud)

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

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