Django:覆盖AuthenticationForm的表单字段是否是正确的方法?

时间:2013-11-16 06:21:16

标签: python django

我发现使用Django 的AuthenticationForm很方便 但由于我们客户端的用户名有点长,要记住,而且客户端的数量不多,我们希望在登录页面中使用select小部件。所以我使用以下代码来实现它。 有效

from django.contrib.auth.forms import AuthenticationForm

class SignInForm(AuthenticationForm):
    username = forms.ModelChoiceField(queryset=User.objects.all())
在views.py中

def post(self, request):
    form = SignInForm(data=request.POST)
    if form.is_valid():
        login(request, form.get_user())
        return HttpResponseRedirect(reverse('account:signin'))
    return render(request, 'account/sign-in.html', {'form': form})

但是,我在文档中找不到任何类似的用法。所以我不确定这样做是否正确。

我不知道它是否与ModelForm类似: https://docs.djangoproject.com/en/1.5/topics/forms/modelforms/#overriding-the-default-field-types-or-widgets

我想知道这里发生了什么。我在SignInForm中声明的用户名是否会阻止AuthenticationForm生成像ModelForm这样的用户名?但AuthenticationForm成功地将我声明的用户名视为应该生成的用户名?

1 个答案:

答案 0 :(得分:2)

看起来不错。

source of AuthenticationForm定义的usernamepassword字段。您的子类正常覆盖了username字段。

所有表单字段实际上都是Python描述符协议的实现。他们只是那里的普通班级成员。