Как продлить форму регистрации "Django"?

Итак, сейчас я делаю основной вход. В urls.py, я перехожу к django contrib login:

(r'^login/?$','django.contrib.auth.views.login',{'template_name':'login.html'}),

Это стреляет сюда:

@csrf_protect
@never_cache
def login(request, template_name='registration/login.html',
          redirect_field_name=REDIRECT_FIELD_NAME,
          authentication_form=AuthenticationForm):

В этом представлении используется модель форм AuthenticationForm:

class AuthenticationForm(forms.Form):
    """
    Base class for authenticating users. Extend this to get a form that accepts
    username/password logins.
    """
    username = forms.CharField(label=_("Username"), max_length=30)
    password = forms.CharField(label=_("Password"), widget=forms.PasswordInput)

Итак... моя цель - изменить форму имени пользователя! Добавив к нему следующее: widget = forms.TextInput(attrs={'placeholder': 'username'}). Это. Это все, что я хочу добавить в поле ввода имени пользователя. Но я не хочу изменять фактический файл django forms.py, так как эта часть django contrib и мне плохо меняет этот файл.

Что мне делать? Должен ли я создать форму, расширяющую AuthenticationForm? Если да, то как мне импортировать это? И как передать это в качестве аргумента через мой urls.py? Я не знаю, что делать.

Ответ 1

Вам нужно подклассифицировать класс AuthenticationForm, а затем вам нужно изменить urls.py,

class MyAuthenticationForm(AuthenticationForm):
    # add your form widget here
    widget = .....

Затем импортируйте этот класс в свой urls.py файл и обновите вызов,

(r'^login/?$','django.contrib.auth.views.login',{'template_name':'login.html', 'authentication_form':MyAuthenticationForm}),

Я слишком устал, чтобы найти ссылки на сайте документации, чтобы узнать, какой тип поля вам нужно использовать, но это должно сделать трюк, чтобы вы начали без необходимости изменения django forms.py, который вы определенно должен чувствовать себя плохо об изменении!

Ответ 2

Как milkypostman, вам нужно создать подкласс auth.forms.AuthenticationForm.

Затем вы можете использовать django-crispy-forms для размещения заполнителей в нужные поля. Это так просто:

(приложение/forms.py)

class LoginWithPlaceholder(AuthenticationForm):

    def __init__(self, *args, **kwargs):
        super(LoginWithPlaceholder, self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.form_show_labels = False
        self.helper.layout = Layout(Div(Field('username', placeholder='username'), css_class="form-group"),
                                    Div(Field('password', placeholder='password'), css_class="form-group"),
                                    Div(Submit('submit', 'Log in')))

Наконец, не забудьте использовать хрустящий тег в вашем шаблоне:

<div class="col-sm-6 col-sm-offset-3">        
{% crispy form %}            
</div>