Расширенная регистрация пользователя (до Profileuser) перед входом в систему, возможно ли это?
Так что я пытаюсь решить это:
Регистрация -> Профиль регистрации -> Вход
(В админке Регистрация = Пользователь и Страница регистрации = Приложение Profileuser)
У меня работает регистрация, подключенная к логину, но хотелось бы, чтобы пользователь добавлял информацию в приложение Profileuser ДО входа. Я пытаюсь использовать сигналы, чтобы.
Получение ошибки:
NoReverseMatch at /profileusers/register/ Не найдено обратное соответствие для 'RegisterPage'. 'RegisterPage' не является допустимой функцией представления или именем шаблона.
Буду очень признателен за любую помощь в решении этой проблемы! (И, да, я новичок в этом деле, все еще учусь)
url.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.all_profiles, name='profiles'),
path('profile_details/', views.profile_details, name='profile_details'),
path('profile_edit/', views.profile_edit, name='profile_edit'),
path('register/', views.Register, name='register'),
path('register_profile/', views.RegisterPage, name='register_profile'), # <int:pk>/
path('login/', views.loginPage, name='login'),
]
views.py
from django.shortcuts import render, redirect, reverse, get_object_or_404
from django.http import HttpResponse, HttpResponseRedirect
from django.contrib import messages
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.decorators import login_required
from django.db.models.functions import Lower
from django.http import JsonResponse
from django.core import serializers
from django.views.generic import TemplateView, View
from .models import Profileuser
from .forms import ProfileuserForm, EditForm, RegisterUserForm
def Register(request):
# pylint: disable=maybe-no-member
form = RegisterUserForm()
if request.method == 'POST':
form = RegisterUserForm(request.POST)
if form.is_valid():
form.save()
user = form.cleaned_data.get('username')
messages.success(request, 'Account was created for ' + user)
return redirect('RegisterPage')
else:
form = RegisterUserForm()
return render(request, 'profileusers/register.html', {'form': form })
def RegisterPage(request):
if request.method == 'POST':
form = EditForm(request.POST,
request.FILES,
instance=request.user.profileuser)
if form.is_valid():
form.save()
messages.success(request, 'Your Profile has been updated!')
return redirect('profile_details')
else:
messages.error(request, 'Update failed. Please check if your inputs are valid.')
else:
form = EditForm(instance=request.user.profileuser)
context = {
'form':form,
'on_profile_page': True
}
return render(request, 'profileusers/profile_edit.html', context)
def loginPage(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return redirect('my_profile')
else:
messages.info(request, 'Username or Password is incorrect!')
template = 'profileusers/login.html'
context = {}
return render(request, template, context)
form.py
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from django import forms
from .models import Profileuser
from django.core.files.images import get_image_dimensions
class RegisterUserForm(UserCreationForm):
class Meta:
model = User
fields = [
'first_name',
'last_name',
'username',
'email',
'password1',
'password2',
]
def save(self, commit=True):
user = super(RegisterUserForm, self).save(commit=False)
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
user.email = self.cleaned_data['email']
if commit:
user.save()
return user
class EditForm(forms.ModelForm):
class Meta:
model = Profileuser
fields = [
'picture',
'firstname',
'lastname',
'title',
'company_name',
'industry',
'profession',
'description',
'phone',
'email',
'city',
'country',
]
class ProfileuserForm(forms.ModelForm):
class Meta:
model = Profileuser
fields = [
'avatar',
'picture',
'firstname',
'lastname',
'title',
'company_name',
'industry',
'profession',
'description',
'phone',
'email',
'city',
'country',
]
register_page.html
......
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">Profile Information</legend>
{{ form|crispy }}
</fieldset>
<div class="row justify-content-center">
<div class="col-3 text-center">
<button class="btn btn-primary" type="submit">Update</button>
</div>
</div>
</form>
......
signals.py
from .models import Profileuser
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save, sender=User)
def create_profileuser(sender, instance, created, **kwargs):
if created:
Profileuser.objects.create(user=instance)
print('Profile is created!')
# post_save.connect(create_profileuser, sender=User)
@receiver(post_save, sender=User)
def update_profileuser(sender, instance, created, **kwargs):
if created == False:
instance.profile.save()
print('Profile is updated!')
# post_save.connect(update_profileuser, sender=User)
profileusers models.py
from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
from django_countries.fields import CountryField
from itertools import chain import random
class Profileuser(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
avatar = models.ImageField(
upload_to='profileavatars', default='profileavatar.png')
picture = models.ImageField(upload_to='images', default='profileavatar.png')
background = models.ImageField(
upload_to='backgroundpics', default='backgroundpic.jpg')
firstname = models.CharField(
max_length=254, blank=False, null=True)
lastname = models.CharField(
max_length=254, blank=False, null=True)
title = models.CharField(max_length=254, blank=True, default=None, null=True)
company_name = models.CharField(
max_length=254, blank=True, null=True)
description = models.TextField(max_length=250, null=True)
email = models.EmailField(
max_length=100, null=False, blank=True)
phone = models.CharField(max_length=40, null=True, blank=True)
city = models.CharField(max_length=50, null=True, blank=False)
country = CountryField(blank_label='Country', null=True, blank=False)
def __str__(self):
# pylint: disable=maybe-no-member
return str(self.user)
Ошибка заключается в том, что внутри функции Register()
в views.py
return redirect('RegisterPage')
необходимо изменить на
return redirect('register_profile')
(не проверенный, но должен работать пример)
Это происходит потому, что внутри redirect()
нужно ввести "имя" страницы, определенной в urls.py
.
Посмотрите документацию Django для получения дополнительной информации. https://docs.djangoproject.com/en/3.2/topics/http/shortcuts/#redirect
(Комментарий ниже, если у вас возникли дополнительные вопросы)