Как мне расширить форму входа в систему Django? - PullRequest
13 голосов
/ 10 января 2011

Итак, сейчас я делаю основной логин. В 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? Я не знаю, что делать.

Ответы [ 3 ]

22 голосов
/ 10 января 2011

Вам нужно создать подкласс класса 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, который вы определенно должен переживать из-за перемен!

1 голос
/ 01 февраля 2017

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

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

(app / 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>
0 голосов
/ 01 января 2019

Вот еще одно решение, использующее path вместо устаревшего url, для создания пользовательской версии страницы и формы для сброса пароля после перехода по ссылке, отправленной по электронной почте. Я использую Django 2 и Python 3.

В папке приложения api я создал папку templates / account с тремя файлами внутри.

base.html:

<!DOCTYPE html>
<html>
  <head>
    <title>{% block head_title %}{% endblock %}</title>
    {% block extra_head %}
    {% endblock %}
  </head>
  <body>
    {% block body %}
    {% block content %}
    {% endblock %}
    {% endblock %}
    {% block extra_body %}
    {% endblock %}
  </body>
</html>

password_reset_complete.html:

{% extends "account/base.html" %}

{% block content %}

<h3>Password reset successful</h3>

<p>Your password has been changed. Please log in using the link below.</p>

<p><a href="/login/">Login</a></p>

{% endblock %}

password_reset_confirm.html:

{% extends 'account/base.html' %}

{% block content %}
  {% if validlink %}
    <h3>Enter your new password</h3>
    <form method="post">
      {% csrf_token %}
      {{ form.as_p }}
      <button type="submit">Change password</button>
    </form>
  {% else %}
    <p>
      The password reset link was invalid, possibly because it has already been used.
      Please request a new password reset.
    </p>
  {% endif %}
{% endblock %}

В моей папке приложения API я создал файл forms.py для своей пользовательской формы, который расширяет стандартную форму SetPasswordForm.

forms.py:

from django import forms
from django.contrib.auth.forms import SetPasswordForm
from django.utils.translation import gettext, gettext_lazy as _
from django.contrib.auth import password_validation

class SetPasswordFormCustom(SetPasswordForm):
    new_password1 = forms.CharField(
        label=_("New password custom"),
        widget=forms.PasswordInput,
        strip=False,
    )
    new_password2 = forms.CharField(
        label=_("New password confirmation custom"),
        strip=False,
        widget=forms.PasswordInput,
        help_text=password_validation.password_validators_help_text_html(),
    )

И, наконец, urls.py:

# api/urls.py
from django.urls import include, path
from django.contrib.auth import views
from django.conf.urls import include, url
from django.views.generic.base import RedirectView
from .forms import SetPasswordFormCustom

urlpatterns = [
...
path('reset/<uidb64>/<token>/',
    views.PasswordResetConfirmView.as_view(template_name='account/password_reset_confirm.html',
    form_class=SetPasswordFormCustom),
    name='password_reset_confirm'),
path('reset/done/', views.PasswordResetCompleteView.as_view(template_name='account/password_reset_complete.html'), name='password_reset_complete'),

]

Примечание 'из .forms import SetPasswordFormCustom'. . позволяет импортировать файл из той же папки.

Моя причина для всего этого состоит в том, что у меня нет пароля для сброса для работы в моем родном интерфейсе React, поэтому мне приходится использовать шаблоны Django для этой функции. Я хочу иметь возможность изменить его стиль и иметь ссылки, которые будут соответствовать моему приложению как можно ближе. Но этот метод, как правило, должен позволять вам создавать свою собственную версию формы авторизации Django.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...