Как зарегистрировать пользователя сразу после регистрации с помощью представлений на основе классов?
Я работаю над сайтом, который занимается продажей изображений, я пытаюсь найти способ, чтобы пользователь мог 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):
....