2013-11-16 3 views
2

Я считаю удобным использовать AuthenticationForm Но поскольку имя пользователя нашего клиента немного запоминается, а количество нашего клиента не так много, мы хотим использовать виджет выбора на странице входа. Поэтому я использую следующий код для его достижения. Работает.Django: Это правильный способ переопределить поле формы AuthenticationForm?

from django.contrib.auth.forms import AuthenticationForm 

class SignInForm(AuthenticationForm): 
    username = forms.ModelChoiceField(queryset=User.objects.all()) 

в views.py:

def post(self, request): 
    form = SignInForm(data=request.POST) 
    if form.is_valid(): 
     login(request, form.get_user()) 
     return HttpResponseRedirect(reverse('account:signin')) 
    return render(request, 'account/sign-in.html', {'form': form}) 

Однако, я не могу найти какой-либо подобное использование в документации. Поэтому я не уверен, правильно ли это сделать.

Я не знаю, является ли это похоже на ModelForm: https://docs.djangoproject.com/en/1.5/topics/forms/modelforms/#overriding-the-default-field-types-or-widgets

Я хочу знать, что случилось здесь. Является ли имя пользователя, которое я объявляю в SignInForm, не позволяет AuthenticationForm генерировать свое имя пользователя, например ModelForm? Но AuthenticationForm успешно обрабатывает имя пользователя, которое я объявляю точно так же, как имя пользователя, которое оно должно было генерировать?

ответ

1

Он выглядит хорошо.

source of AuthenticationFormusername и password раздел. Ваш подкласс переопределял поле username как обычно.

Все поля формы являются фактически реализациями протокола дескриптора Python. Они только общие члены класса.

Смежные вопросы