Динамическое начальное значение для имени пользователя с использованием форм и представлений из django.contrib.auth - PullRequest
0 голосов
/ 04 марта 2011

В настоящее время я использую представление login и AuthenticationForm из django.contrib.auth.views для входа в систему пользователей.

Теперь я хотел бы расширить это решение, чтобы предварительно заполнить поле username из объекта request (я могу вывести имя пользователя, если посетители аутентифицированы в другом месте). Поскольку я ленивый и хотел бы сохранять сухим , мне интересно, возможно ли это без репликации всего кода представления входа в систему.

Мне известны динамические начальные значения в Django, но я не вижу, как они могут быть переданы в представление входа в систему (которое не принимает экземпляры формы в качестве параметра). < На канале IRC было предложено расширить AuthenticationForm для обработки запроса, однако (насколько я понимаю) запрос не всегда передается в форму (скорее только когда форма отправлена, что будет слишком поздно).

Единственная альтернатива, которую я могу придумать, - это написать пользовательское представление входа в систему для добавления начальных значений, которое в основном будет копировать код из пакета contrib.auth (плюс передача начальных значений в форму).

Тогда мой вопрос заключается в следующем: есть ли более простая альтернатива, которая обойдется без копирования кода? Любые советы будут высоко оценены. Спасибо!

1 Ответ

1 голос
/ 04 марта 2011

Запрос передан в форму на GET - см. Строку 54 django.contrib.auth.views.Так что да, расширение формы для ввода имени пользователя кажется наилучшим способом.Что-то вроде (не проверено):

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)
...