Расширенная регистрация пользователя (до 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

(Комментарий ниже, если у вас возникли дополнительные вопросы)

Вернуться на верх