Как продлить форму регистрации "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>