Skip to main content
 首页 » 编程设计

python之Django:覆盖 AuthenticationForm 的表单字段是正确的方法吗

2024年11月01日33sharpest

我发现使用 Django 的 AuthenticationForm 很方便 但是由于我们客户的用户名有点长,不好记,而且我们的客户量也不多,所以我们想在登录页面使用select widget。所以我用下面的代码来实现。 有效。

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 成功地将我声明的用户名视为它应该生成的用户名?

请您参考如下方法:

看起来不错。

source of AuthenticationForm定义了 username 和 password 字段。您的子类照常覆盖了 username 字段。

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