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

使用django.contrib.auth中的表单和视图的用户名的动态初始值,django,authentication,dry,Django,Authentication,Dry,我目前正在使用login视图和django.contrib.auth.views中的AuthenticationForm登录用户 现在,我想扩展这个解决方案,从请求对象中预填充用户名字段(如果访问者在别处经过身份验证,我可以推断用户名)。因为我很懒,希望保持干燥,我想知道这是否可能,而不复制整个登录视图代码 我知道Django中有,但我看不出这些信息是如何传递到的(它不接受表单实例作为参数)。在IRC通道上,有人建议我扩展AuthenticationForm来处理请求,但是(据我所知),请求并不

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

现在,我想扩展这个解决方案,从
请求
对象中预填充
用户名
字段(如果访问者在别处经过身份验证,我可以推断用户名)。因为我很懒,希望保持干燥,我想知道这是否可能,而不复制整个登录视图代码

我知道Django中有,但我看不出这些信息是如何传递到的(它不接受表单实例作为参数)。
在IRC通道上,有人建议我扩展
AuthenticationForm
来处理请求,但是(据我所知),请求并不总是传递到表单(而只是在提交表格时,这将太晚)

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

那么,我的问题是:有没有一个更简单的替代方案,一个不用复制代码就可以通过的方案?任何提示都将不胜感激。谢谢!

请求被传递到get上的表单中-请参见django.contrib.auth.views的第54行。因此,是的,扩展表单以使用用户名似乎是最好的方法。类似于(未测试):

事实上,我的观点是正确的(cf.)。您的代码也工作得很好。非常感谢,这非常有帮助!
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)