Форма аутентификации никогда не является действительной в django

У меня есть приложение django с аутентификацией в нем. У меня есть файл forms.py следующего вида:

<form class="login_form" method="post" novalidate>
            {% csrf_token %}
            <div class="col-md-3 col-md-auto text-center">
                <b>First Name:<b>
                {{ form.first_name }}
                {% if 'first_name' in error %}
                  <div style='color:red'>{{error.first_name.0.message}}</div>
                {% endif %}
              </div>

              
              <div class="col-md-3 col-md-auto text-center">
                <b>Last Name:<b>
                {{ form.last_name }}
                {% if 'last_name' in error %}
                  <div style='color:red'>{{error.last_name.0.message}}</div>
                {% endif %}
              </div>

              <div class="col-md-3 col-md-auto text-center">
                <b>username:<b>
                {{ form.username }}
                {% if 'username' in error %}
                  <div style='color:red'>{{error.username.0.message}}</div>
                {% endif %}
              </div>

              <div class="col-md-3 col-md-auto text-center">
                <b>Email:<b>
                {{ form.email }}
                {% if 'email' in error %}
                  <div style='color:red'>{{error.email.0.message}}</div>
                {% endif %}
              </div>

              <div class="col-md-3 col-md-auto text-center">
                <b>Password<b>
                {{ form.password }}
                {% if 'password' in error %}
                  <div style='color:red'>{{error.password.0.message}}</div>
                {% endif %}
              </div>

              <div class="col-md-3 col-md-auto text-center">
                <b>Confirm password:<b>
                {{ form.confirm_password }}
                {% if 'confirm_password' in error %}
                  <div style='color:red'>{{error.confirm_password.0.message}}</div>
                {% endif %}
              </div>
            <button type="submit" class="submit_btn">Sign Up</button>
            <span class="peder"><p>If you already have account<br><a href="">Login</a></p></span>
          </form>

и forms.py:

class CustomerSignUpForm(UserCreationForm):
    first_name = forms.CharField(required=True)
    last_name = forms.CharField(required=True)
    email = forms.EmailField(required=True)
    username = forms.CharField(max_length=40)
    password = forms.CharField(max_length=30)
    confirm_password = forms.CharField(max_length=30)


    class Meta(UserCreationForm.Meta):
        model = User
    
    @transaction.atomic
    def save(self):
        user = super().save(commit=False)
        user.is_customer = True
        user.save()
        customer = Customer.objects.create(user=user)
        customer.first_name = self.cleaned_data.get('first_name')
        customer.last_name = self.cleaned_data.get('last_name')
        customer.username = self.cleaned_data.get('username')
        customer.email = self.cleaned_data.get('email')
        customer.password = self.cleaned_data.get('password')
        customer.confirm_password = self.cleaned_data.get('confirm_password')
        customer.save()
        return user

Моя модель выглядит следующим образом:

class User(AbstractUser):
    is_customer = models.BooleanField(default=False)
    is_employee = models.BooleanField(default=False)
    # first_name = models.CharField(max_length=100)
    # last_name = models.CharField(max_length=100)

    signup_confirmation = models.BooleanField(default=False)

class Customer(models.Model):
    user = models.OneToOneField(User, on_delete = models.CASCADE, primary_key = True)
    first_name = models.CharField(max_length=100, blank=True)
    last_name = models.CharField(max_length=100, blank=True)
    username = models.CharField(max_length=40, blank=True)
    email = models.EmailField(max_length=40, blank=True)
    password = models.CharField(max_length=30, blank=True)
    confirm_password = models.CharField(max_length=30, blank=True)

Когда пользователь нажимает кнопку submit на форме регистрации, она должна сохранить форму и отправить ему письмо. view

class customer_register(CreateView):
    model = User
    form_class = CustomerSignUpForm
    template_name = 'authentication/customer_register.html'
    def form_valid(self, form):

        user = form.save()
        # current_site = get_current_site(request)
        current_site = '127.0.0.1:8000'
        subject = 'Please Activate Your Account'
        message = render_to_string('authentication/email/activation_request.html', {
            'user': user,
            'domain': current_site,
            'uid': urlsafe_base64_encode(force_bytes(user.pk)),
            'token': account_activation_token.make_token(user),
        })
        send_mail(
            subject,
            message,
            'from@example.com',
            ['to@example.com'],
            fail_silently=False,
        )
        return redirect('/')

Но когда я нажимаю кнопку submit на моей странице, ничего не происходит. В терминале я получаю [13/Sep/2022 08:18:39] "POST /accounts/customer_register/ HTTP/1.1" 200 9660, но пользователь не создан и письмо не отправлено. Не мог бы кто-нибудь объяснить, почему это происходит, и предложить решение? Спасибо:)

прежде всего

нам нужно установить несколько зависимостей

1. pip install django-crispy-forms
2. add 'crispy_forms', to your INSTALLED_APPS in your projects settings.py
3. add CRISPY_TEMPLATE_PACK = 'bootstrap4' to your settings.py

authentication/customer_register.html

мы упрощаем форму через crispy forms, что дает нам результат bootstrap 4

{% load crispy_forms_tags %}

<form class="login_form" method="post" novalidate>
    {% csrf_token %}
    {% crispy form %}
    <button type="submit" class="btn btn-success mt-3 float-end">Submit</button>
</form>

forms.py

Создаем модельForm, принимая модель User и ее поля в качестве Meta from django import forms

class CustomerSignUpForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ['first_name', 'last_name', 'email', 
                  'username', 'password', 'confirm_password']

views.py

The generic view CreateView Polymorphism already benefits of the post method that will save the user

from django.views.generic import CreateView
from.forms import CustomerSignUpForm

class CustomerRegisterCreateView(CreateView):
    model = User
    form_class = CustomerSignUpForm
    template_name = 'authentication/customer_register.html'

urls.py

Мы создаем путь, чтобы мы могли связать его с URL, не забывая о .as_view(), поскольку это представление на основе класса (представления на основе функций не требуют этого)

 from .views import (
       CustomerRegisterCreateView,
 )


urlpatterns = [
    path('customer-register/', CustomerRegisterCreateView.as_view(), name="customer-register"),
    ]

models.py

Once a user is created, we use a signal that will trigger on user creation 


from django.db.models.signals import post_save

def User_receiver(sender, instance, created, *args, **kwargs):

    if created:
        print('we went thought the User signal !')
        subject = "Welcome"
        email_template_name = "authentication/Register-email.txt"
        user = User.objects.get(username=instance.username)
        c = {
            'username': user,
        }
        email = instance.email
        email_1 = render_to_string(email_template_name, c)
        send_mail(subject, email_1, 'your_email',
              [email], fail_silently=False)
 '''
 post_save.connect(User_receiver, sender=User)
Вернуться на верх