Поля для password1, password2 отображаются (на странице регистрации) даже после использования переменной «exclude» в мета-классе UserRegistrationForm в forms.py - PullRequest
1 голос
/ 14 июня 2019

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

Я использую django 2.2.2 и python 3.7.3.Я использую crispy_forms для визуализации форм.

Соответствующая документация по формам django здесь .

Я уже использовал переменную "exclude" в Meta-классе моего класса UserRegisterForm,Смотрите код, чтобы точно узнать, что я сделал

В forms.py файле:

class UserRegisterForm(UserCreationForm):
    """
    Inheriting the UserCreationForm class to add some additional fields in
    the registration form because the #s of fields
    in the UserCreationForm class has less fields than required.
    We add email field in this extended class.
    """

    email = forms.EmailField()

    class Meta:
        model = User
        fields = ("username", "email")
        exclude = ("password1", "password2")

Мой register.html файл шаблона:

{% extends "blog/base.html" %}
{% load i18n %}
{% load crispy_forms_tags %}

{% block content %}
  <div class="content-section">
    <form method="POST">
      {% csrf_token %}
      <fieldset class="form-group">
        <legend>
          Join here!
        </legend>
        {{ form|crispy }}
      </fieldset>
      <div>
        <button>Sign up!</button>
      </div>
    </form>
    <small class="text-muted">
      Already have an account? Sign in <a href="{% url "login" %}" class="ml-2">here</a>.
    </small>
  </div>
{% endblock content %}

мой views.py файл:

def register(request):
    """
    Triggered when AnonymousUser clicks on the 'Sign Up' button anywhere on the site

    The process:
    1. User visits registration page
    2. User enters his/her email only.
    3. System makes an account in the database & sends an email
       to that id with the password.
    4. User logs in the website using that password
    """
    if not request.user.is_authenticated:
        if request.method == "POST":
            request.POST = request.POST.copy() # To make the request.POST mutable
            request.POST['password1'] = get_random_alphanumeric_password(_max_len=8)
            request.POST['password2'] = request.POST['password1']
            form = UserRegisterForm(request.POST)

            if form.is_valid():
                form.save()
                # WORKS!
                messages.success(request, _(f"Account successfully created"))
                send_mail(subject=_(f"KBank - Password for {request.POST['username']}"),
                          message=_(f"Thanks for signing up at KBank. The password is {request.POST['password1']}"),
                          from_email=os.environ.get("EMAIL_USER"),
                          recipient_list=[f"{request.POST['email']}"],
                          )
                messages.info(request, _("Please check your email for password & log in using that"))
                return redirect('login')
        else:
            form = UserRegisterForm()
        return render(request, "users/register.html", {"form": form})
    else:
        return redirect("site-home")

Ошибка в двух полях, запрашивающих пароль1 и пароль 2 все еще отображается на моей странице регистрации.

enter image description here

1 Ответ

0 голосов
/ 14 июня 2019

Атрибуты fields и exclude предназначены для полей, созданных из модели.Поля password1 и password2 не из модели, это дополнительные поля, определенные непосредственно в UserCreationForm.

Вы можете переопределить метод init, чтобы удалить их из формы, но я не уверен, зачем вам это делать,И я также не понимаю, почему, если вы не хотите показывать формы, вы все равно хотите изменить запрос.POST, чтобы передать их. На самом деле вы должны просто использовать стандартную ModelForm, а затем установить произвольный пароль при сохранении.Итак:

class UserRegisterForm(forms.ModelForm):

    class Meta:
        model = User
        fields = ("username", "email")

def register(request):
    if not request.user.is_authenticated:
        if request.method == "POST":
            form = UserRegisterForm(request.POST)

            if form.is_valid():
                user = form.save(commit=False)
                new_password = get_random_alphanumeric_password(_max_len=8)
                user.set_password(new_password)
                user.save()
                messages.success(request, _(f"Account successfully created"))
                send_mail(subject=_(f"KBank - Password for {user.username}"),
                      message=_(f"Thanks for signing up at KBank. The password is {new_password}"),
                      from_email=os.environ.get("EMAIL_USER"),
                      recipient_list=[user.email],
                )
        ...

(Обратите внимание, что вы должны использовать данные из объекта пользователя, а не необработанные данные POST, в электронном письме.)

...