Django AuthenticationForm 自定义

问题描述

我对 Django 比较陌生,想自定义 AuthenticationForm 但不知道如何去做。我基本上想覆盖 init 函数,以便能够注入属性并控制表单上显示内容。具体来说,我想为我的登录表单添加这个:

def __init__(self,*args,**kwargs):
    super().__init__(*args,**kwargs)
    self.fields['username'].widget = forms.widgets.TextInput(attrs={
            'class': 'form-control'
        })
    self.fields['password1'].widget = forms.widgets.PasswordInput(attrs={
            'class': 'form-control'
        })

我的问题是我在创建登录视图/表单时让 django 为我完成所有工作,因此我不确定如何自定义它。阅读文档 LoginView 使用认的 AuthenticationForm。

非常感谢任何帮助!

编辑:想出来以防其他人从谷歌读到这个

我的项目的 urls.py(添加了帐户/登录/和 2 个导入)-

from django.contrib.auth.views import LoginView

from blog.forms import MyAuthenticationForm


    path('accounts/login/',LoginView.as_view(authentication_form=MyAuthenticationForm)),path('accounts/',include('django.contrib.auth.urls'))

然后我创建了自己的表单,但像这样扩展了 AuthenticationForm :

class MyAuthenticationForm(AuthenticationForm):
    def __init__(self,**kwargs):
        super().__init__(*args,**kwargs)
        self.fields['username'].widget = forms.widgets.TextInput(attrs={
                'class': 'form-control'
            })
        self.fields['password'].widget = forms.widgets.PasswordInput(attrs={
                'class': 'form-control'
            })

现在一切正常!

解决方法

您可以编写一个派生自 CustomForm 的类 AuthenticationForm 并对其进行处理。

您还可以使用如下所示的小部件关键字参数强制字段使用所需的小部件而不是默认小部件:

<A field> =  forms.<A Field>(widget = <A Widget>(attrs = {'class': 'form-control' })