Django UserCreationForm с пользовательской формой не работает

#django-forms #django-registration

#django-forms #django-регистрация

Вопрос:

 I have a custom template where you have to put (first_name, last_name, email, password1, password2) for registration --> no username. I tried to use CserCreationForm in the below form but it is not workin, at the end after feeding up the form with data, nothing happens by clicking on submit. Could you please advice where is the problem? Thanks in advance guys! 
  

forms.py — Я создал форму регистрации, наследующую от UserCreationForm, мне нужны заполнители таким образом__init_ метод

 class SignUpForm(UserCreationForm):

    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'username', 'email', 'password1', 'password2', )

    def __init__(self, *args, **kwargs):
        super(SignUpForm, self).__init__(*args, **kwargs)
        self.fields['first_name'].widget.attrs['placeholder'] = 'Imie'
        self.fields['last_name'].widget.attrs['placeholder'] = 'Nazwisko'
        self.fields['email'].widget.attrs['placeholder'] = 'Email'
        self.fields['password1'].widget.attrs['placeholder'] = 'Hasło'
        self.fields['password2'].widget.attrs['placeholder'] = 'Powtórz Hasło'


    def save(self, commit=True):
        user = super(SignUpForm, self).save(commit=False)
        user.first_name = self.cleaned_data["first_name"]
        user.last_name = self.cleaned_data["last_name"]
        user.username = self.cleaned_data["first_name"]
        user.email = self.cleaned_data["email"]
        if commit:
            user.save()
        return user
  

views.py — здесь я использую то, что предлагает django:)

 class RegisterView(CreateView):
   form_class = SignUpForm
   template_name = "register.html"
   success_url = "login"
  

шаблон: у меня был шаблон, в котором нужно было заполнить несколько полей, как указано вверху, поэтому я не использую простой {{form.as_table}, а имя пользователя не является обязательным именем, оно должно совпадать с first_name

 {% extends 'base.html' %}
{% block content %}
{% load static %}
  <body>
  {% block header %} {% endblock %}
  {% block slogan %} {% endblock %}
    <section id = "register" class="login-page">
      <h2>Załóż konto</h2>
      <form method="POST" action="">
        {% csrf_token %}
        <div class="form-group">
            {{form.first_name}}
        </div>
         <div class="form-group">
            {{form.last_name}}
        </div>
        <div class="form-group">
            {{form.email}}
        </div>
        <div class="form-group">
            {{form.password1}}
        </div>
        <div class="form-group">
            {{form.password2}}
        </div>
        <div class="form-group form-group--buttons">
          <a href="login.html" class="btn btn--without-border">Zaloguj się</a>
          <button class="btn" type="submit">Załóż konto</button>
        </div>
      </form>
    </section>
  </body>
{% endblock %}
  

urls.py

   path('register/', RegisterView.as_view(), name = "register")
  

Комментарии:

1. Я думаю, вам не нужно устанавливать first_name и т. Д. Вручную В методе сохранения. Но вы должны зашифровать пароль в этом методе сохранения, например: user.set_password(self.cleaned_data["password1"])

Ответ №1:

У вас есть лишняя запятая после ‘password2’. класс Meta: модель = Поля пользователя = (‘first_name’, ‘last_name’, ‘username’, ’email’, ‘password1’, ‘password2’,)

В любом случае вы должны указать имя вызываемой вами функции в действии формы. Это должно быть что-то вроде этого.

  <section id = "register" class="login-page">
  <h2>Załóż konto</h2>
  <form method="POST" action="{% url 'login'%}">
    {% csrf_token %}
  

Комментарии:

1. Привет, fukurowl, спасибо за подсказку с запятой, но это не помогает, после нажатия кнопки отправки все равно ничего не происходит, я оставил действие пустым, потому что я не хочу перенаправляться на страницу входа в систему, если пользователь не создан, но я знаю, что вы имели в виду. В любом случае, спасибо, я все еще пытаюсь решить свою проблему с кодом.