问题描述
我对 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' })