【问题标题】:Forms hierarchy issue in DjangoDjango中的表单层次结构问题
【发布时间】:2011-10-12 05:16:36
【问题描述】:

我创建了一个登录表单,就像这样:

class LoginForm(AuthenticationForm):
    username = forms.CharField (label=_("Usuario"), max_length=30, 
                widget=forms.widgets.
                TextInput(attrs={'id':'username','maxlength':'25'}))
    password = forms.CharField (label=_("Password"), widget=forms.widgets.
                PasswordInput(attrs={'id':'password','maxlength':'10'}))

我在这个视图中使用它:

def login(request):
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
                ...

调试后,我意识到 form.is_valid() 方法返回 false,因为 is_bound 属性为 false。我是否必须重新定义表单中的某些内容或修改我的视图???

编辑 1

我已经关注了这个关于 is_valid() 方法返回 False 的问题: form.is_valid() always returning false

但问题仍然存在。

【问题讨论】:

    标签: django forms authentication login


    【解决方案1】:

    关于当前接受的答案需要注意的一个问题:

    form = LoginForm(request=request, data=request.POST)
    

    是,传入请求似乎启用了 Django 在启动会话之前检查测试 cookie 是否成功的行为。问题是,如果您之前没有设置测试 cookie(必须在之前的查看请求中设置),它将失败并且您的登录将失败。我建议像这样传递 data 关键字参数:

    form = LoginForm(data=request.POST)
    

    除非我遗漏了一些重要的东西(似乎 cookie 检查不是绝对必要的),否则这在大多数情况下效果更好。您也可以在加载登录页面的视图中调用 request.set_test_cookie(),但这并不涵盖所有场景。

    【讨论】:

      【解决方案2】:

      该问题实际上与您链接到的问题中的问题相似。继承自 django.contrib.auth.forms.AuthenticationForm 的表单将 request 作为其第一个参数,在通常的 data 参数之前。这就是为什么您的表单报告它未绑定的原因 - 就它而言,您没有传递任何数据,因此它没有可绑定的内容。

      因此,在您看来,您需要像这样实例化它:

      form = LoginForm(request=request, data=request.POST)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-14
        • 1970-01-01
        相关资源
        最近更新 更多