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

сейчас я делаю основной логин. В urls.py я захожу в django contrib login:

(r'^login/?

Это стреляет это здесь:

@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, и я чувствую себя плохо, изменяя этот файл.

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

,'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, и я чувствую себя плохо, изменяя этот файл.

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

Ответы на вопрос(3)

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

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

(Приложение / 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>
 rikb14 мар. 2017 г., 18:56
Спасибо за указатель на хрустящий!
Решение Вопроса

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

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

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

(r'^login/?

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

,'django.contrib.auth.views.login',{'template_name':'login.html', 'authentication_form':MyAuthenticationForm}),

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

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.

Ваш ответ на вопрос