如何扩展Django"登录"表单?

TIM*_*MEX 13 python oop authentication django class

所以,现在我正在进行基本登录.在urls.py中,我转到django contrib登录:

(r'^login/?$','django.contrib.auth.views.login',{'template_name':'login.html'}),
Run Code Online (Sandbox Code Playgroud)

它射到了这里:

@csrf_protect
@never_cache
def login(request, template_name='registration/login.html',
          redirect_field_name=REDIRECT_FIELD_NAME,
          authentication_form=AuthenticationForm):
Run Code Online (Sandbox Code Playgroud)

该视图使用AuthenticationForm表单模型:

class AuthenticationForm(forms.Form):
    """
    Base class for authenticating users. Extend this to get a form that accepts
    username/password logins.
    """
    username = forms.CharField(label=_("Username"), max_length=30)
    password = forms.CharField(label=_("Password"), widget=forms.PasswordInput)
Run Code Online (Sandbox Code Playgroud)

所以... 我的目标是更改用户名表单!通过添加它:widget = forms.TextInput(attrs={'placeholder': 'username'}).而已.这就是我要添加到用户名输入框的全部内容.但是,我不想更改实际的django forms.py文件,因为这是django contrib的一部分,我觉得更改该文件很糟糕.

我该怎么办?我应该创建一个扩展AuthenticationForm的表单吗?如果是这样,我该如何导入?我如何通过我的urls.py将其作为参数传递?我不知道该怎么办.

mil*_*man 22

你需要继承AuthenticationForm类,然后你需要改变你的urls.py,

class MyAuthenticationForm(AuthenticationForm):
    # add your form widget here
    widget = .....
Run Code Online (Sandbox Code Playgroud)

然后将此类导入您的urls.py文件并更新调用,

(r'^login/?$','django.contrib.auth.views.login',{'template_name':'login.html', 'authentication_form':MyAuthenticationForm}),
Run Code Online (Sandbox Code Playgroud)

我太累了查找的文档站点的链接,看你需要什么类型的字段的使用,但这应该做的伎俩,让你开始,而无需修改Django的forms.py,你一定觉得不好改变!