我目前正在使用login
视图和AuthenticationForm
django.contrib.auth.views
来登录用户。
现在,我想扩展此解决方案以预填充username
对象中的request
字段(如果访问者在其他位置进行身份验证,我可以推断用户名)。因为我很懒,并希望保持 dry ,我想知道如果不复制整个登录视图代码,这是否可行。
我知道Django中的dynamic initial values,但是我看不出这些如何传递到login view(它不接受表单实例作为参数)。
在IRC频道上,有人建议我扩展AuthenticationForm
以处理请求,但是(据我所知),请求不总是传递给表单(而只是在表单中)提交,这太晚了。)
我能想到的唯一选择是编写自定义登录视图来添加初始值,这基本上会复制contrib.auth
包中的代码(再加上将初始值传递给表单)。
我的问题是:是否有一个更简单的替代品,一个可以在不复制代码的情况下获得的替代品?任何提示都将非常感激。谢谢!
答案 0 :(得分:1)
请求 传递到GET上的表单 - 请参阅django.contrib.auth.views的第54行。所以是的,扩展表单以获取用户名似乎是最好的方式。像(未经测试)的东西:
class ExtendedAuthForm(AuthenticationForm):
def __init__(self, request=None, *args, **kwargs):
if request is not None:
username = request.get_username_however()
initial = kwargs.get('initial', {})
initial_default = {'username': username}
initial_default.update(initial)
kwargs['initial'] = initial_default
super(ExtendedAuthForm, self).__init__(request, *args, **kwargs)