Django中的表单层次结构问题

Django中的表单层次结构问题,django,forms,authentication,login,Django,Forms,Authentication,Login,我创建了一个登录表单,如下所示: class LoginForm(AuthenticationForm): username = forms.CharField (label=_("Usuario"), max_length=30, widget=forms.widgets. TextInput(attrs={'id':'username','maxlength':'25'})) password = forms.

我创建了一个登录表单,如下所示:

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'}))
form = LoginForm(request=request, data=request.POST)
我在这个观点中使用它:

def login(request):
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
                ...
调试后,我意识到form.is\u valid()方法返回false,因为is\u绑定属性为false。我是否必须在我的表单中重新定义某些内容或修改我的视图

编辑1

我已经回答了关于返回False的is_valid()方法的问题:


但问题仍然存在。

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

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

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'}))
form = LoginForm(request=request, data=request.POST)

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

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

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'}))
form = LoginForm(request=request, data=request.POST)

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

form = LoginForm(request=request, data=request.POST)
传入请求似乎使Django能够在启动会话之前检查测试cookie是否成功。问题是,如果您以前没有设置测试cookie(必须在以前的视图请求中设置),那么它将失败,您的登录也将失败。我建议只传递data关键字参数,如下所示:

form = LoginForm(data=request.POST)

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

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

form = LoginForm(request=request, data=request.POST)
传入请求似乎使Django能够在启动会话之前检查测试cookie是否成功。问题是,如果您以前没有设置测试cookie(必须在以前的视图请求中设置),那么它将失败,您的登录也将失败。我建议只传递data关键字参数,如下所示:

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