使用django.contrib.auth中的表单和视图的用户名的动态初始值

时间:2011-03-04 12:06:13

标签: django authentication dry

我目前正在使用login视图和AuthenticationForm django.contrib.auth.views来登录用户。

现在,我想扩展此解决方案以预填充username对象中的request字段(如果访问者在其他位置进行身份验证,我可以推断用户名)。因为我很懒,并希望保持 dry ,我想知道如果不复制整个登录视图代码,这是否可行。

我知道Django中的dynamic initial values,但是我看不出这些如何传递到login view(它不接受表单实例作为参数)。
在IRC频道上,有人建议我扩展AuthenticationForm以处理请求,但是(据我所知),请求总是传递给表单(而只是在表单中)提交,这太晚了。)

我能想到的唯一选择是编写自定义登录视图来添加初始值,这基本上会复制contrib.auth包中的代码(再加上将初始值传递给表单)。

我的问题是:是否有一个更简单的替代品,一个可以在不复制代码的情况下获得的替代品?任何提示都将非常感激。谢谢!

1 个答案:

答案 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)