Как зарегистрировать пользователя сразу после регистрации с помощью представлений на основе классов?

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

Ниже приведены представления, основанные на function:

Мой models.py:

from django.db import models
from django.contrib.auth.models import User


class JobType(models.Model):
    job_name = models.CharField(max_length=50)

    def __str__(self):
        return self.job_name


class Country(models.Model):
    country_name = models.CharField(max_length=50)

    def __str__(self):
        return self.country_name


class IndianState(models.Model):
    state_name = models.CharField(max_length=30)

    def __str__(self):
        return self.state_name


class SignUpModel(User):
    company_name = models.CharField(max_length=80)
    job = models.ForeignKey(JobType, on_delete=models.CASCADE)
    mobile_no = models.PositiveIntegerField()
    country = models.ForeignKey(
        Country, on_delete=models.CASCADE, blank=True)
    state = models.ForeignKey(IndianState, on_delete=models.CASCADE)

forms.py

Помните : Здесь я переопределил форму django's для своей цели.

views.py

from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.contrib.auth import authenticate, login, logout
from django.contrib import messages
from about.models import SignUpModel
from . forms import LoginForm
from django.views.generic.base import TemplateView
from django.contrib.auth.views import LoginView, LogoutView
from . forms import SignUpForm
from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required
from django.contrib.auth import authenticate, login
from django.contrib import messages
from django.contrib.auth.hashers import make_password
from django.contrib.auth import login, authenticate

# @cache_page(60*60*24)


def about_first_page(request):
    return render(request, 'aboutus/home.html')


# @cache_page(60*60*24)
def pricing(request):
    return render(request, 'aboutus/pricing.html')


class MyLoginView(LoginView):
    template_name = 'aboutus/registration.html'
    authentication_form = LoginForm


class MyLogoutView(LogoutView):
    template_name = 'aboutus/logout.html'


@method_decorator(login_required(login_url='/about/registration/'), name='dispatch')
class UserMyAccounts(TemplateView):
    def get(self, request, *args, **kwargs):
        return super().get(request, *args, **kwargs)
    template_name = 'aboutus/myaccounts.html'


def sign_up(request):
    if request.method == 'POST':
        form = SignUpForm(request.POST)
        if form.is_valid():
            un = form.cleaned_data['username']
            pword = make_password(form.cleaned_data['password'])

            fname = form.cleaned_data['first_name']
            lname = form.cleaned_data['last_name']
            em = form.cleaned_data['email']
            compname = form.cleaned_data['company_name']
            job = form.cleaned_data['job']
            mobno = form.cleaned_data['mobile_no']
            country = form.cleaned_data['country']
            state = form.cleaned_data['state']
            sign_up_prop = SignUpModel(first_name=fname, last_name=lname,
                                       username=un, password=pword, email=em,
                                       company_name=compname, job=job, mobile_no=mobno, country=country, state=state)
            sign_up_prop.save()

            """username and password from request"""
            un_request = request.POST.get('username')
            pass_request = request.POST.get('password')

            authen = authenticate(
                request, username=un_request, password=pass_request)
            if authen is not None:
                login(request, authen)
                return HttpResponseRedirect('/about/myaccounts/')

    else:
        form = SignUpForm()
    return render(request, 'aboutus/sign-up.html', {'form': form})

urls.py

from django import views
from django.urls import path
from about import views
from django.contrib.auth import views as auth_views
from django.views.generic.base import TemplateView
from .forms import LoginForm
urlpatterns = [
    path('', views.about_first_page, name='about_first_page'),
    path('pricing', views.pricing, name='pricing'),
    path('registration/', views.MyLoginView.as_view(), name='login'),
    path('logout/', views.MyLogoutView.as_view(), name='logout'),
    path('sign-up/', views.sign_up, name='sign-up'),
    path('myaccounts/', views.UserMyAccounts.as_view(), name='myaccounts')
]

Выше с видом, основанным на function, он работает правильно, но когда я начинаю делать это с видом, основанным на class, я застрял на этом моменте:

Все остальные files одинаковы.

Это views.py с class основанным представлением:

class SignUpView(CreateView):
    form_class = SignUpForm
    template_name = 'aboutus/sign-up.html'
    success_url = '/about/myaccounts/'

Итак, как я могу сделать то же самое с основой class?

Вы можете использовать form_valid[Django-doc] метод

class SignUpView(CreateView):
  form_class = SignUpForm
  template_name = 'aboutus/sign-up.html'
  success_url = '/about/myaccounts/'
  
  def form_valid(self, form):
      response = super().form_valid(form)
      form.save()
      username = form.cleaned_data.get("username")
      raw_password = form.cleaned_data.get("password")
      user = authenticate(username=username, password=raw_password)
      login(self.request, user)
      return response

Update

обновите ваш forms.py

from django.contrib.auth.forms import UserCreationForm

class SignUpForm(UserCreationForm):
    ....
Вернуться на верх