Django Модель во время входа пользователя в систему

Я новичок в программировании. Мне нужно сделать модель/таблицу в django, в которой должны сохраняться данные пользователя. Если пользователь вошел в систему, он переходит на страницу регистрации, если он не завершил регистрацию, в противном случае, если он уже завершил регистрацию, он перейдет на главную страницу.

Что мне делать?

models.py

class UserReg(models.Model):
Name=models.CharField(max_length=200)
Date_of_Birth=models.DateField()
Age=models.IntegerField()
Gender=models.CharField(max_length=200, choices=GenderChoice)
Phone_no=models.IntegerField()
Mail=models.EmailField(unique=True)
Address=models.TextField(max_length=700)
District=models.ForeignKey(District,on_delete=models.CASCADE)
Branch=models.ForeignKey(Branch,on_delete=models.CASCADE)
Account_Type=models.CharField(max_length=200,choices=AccType)
Materials=models.ManyToManyField(Materials)

views.py

def reg(request):
form = Userform()
if request.method == 'POST':
    form=Userform(request.POST)
    if form.is_valid():
        Name=request.POST.get('Name')
        Date_of_Birth = request.POST.get('Date_of_Birth')
        Age = request.POST.get('Age')
        Gender = request.POST.get('Gender')
        Phone_no  = request.POST.get('Phone_no')
        Mail   = request.POST.get('Mail')
        Address  = request.POST.get('Address')
        District   = request.POST.get('District')
        Branch   = request.POST.get('Branch')
        Account_Type = request.POST.get('Account_Type')
        Materials = request.POST.get('Materials')
        obj=UserReg(Name=Name,Date_of_Birth=Date_of_Birth,Age=Age,Gender=Gender,Phone_no=Phone_no,Mail=Mail,Address=Address,District=District,Branch=Branch,Account_Type=Account_Type,Materials=Materials)
        obj.save()
        return redirect('/')



return render(request,'registration.html',{'form':form,})

Сначала вам нужно привязать UserReg к модели User, добавив поле отношения OneToOne в вашу модель UserReg:

class UserReg(models.Model):
   user = models.OneToOneField(User, on_delete=models.CASCADE)
   # rest of your fields

Вы можете создать для него модельФормы:

    class UserRegForm(forms.ModelForm):
       class Meta:
          model = UserReg
          fields = '__all__'
          widgets = {'user': forms.HiddenInput }

В представлении reg сначала проверьте, есть ли у пользователя объект UserReg, и если нет, перейдите к представлению:

def reg(request):
  if request.user.userreg:
    return redirect ('/')

  if request.method == 'POST':
     form = UserRegForm(request.POST)
     if form.is_valid():
        form.save()
        return redirect ('/')
  else:
     form = UserRegForm(initial={'user': request.user})
  
  return render(request,'registration.html',{'form':form,})

Думаю, лучше всего сделать декоратора костюмов

#in your UserReg add a new field User
 class UserReg(models.Model):
     user = models.OneToOneField(User, related_name="profile", on_delete=models.CASCADE)
     ...otherfields

не забудьте импортировать User и инстанцировать пользователя над моделью UserReg

 from django.contrib.auth import get_user_model
  User = get_user_model()

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

python manage.py makemigrations
python manage.py migrate # 

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

def complete_registration(view_func):
    def wrapper_func(request, *args, **kwargs):
       if request.user.userreg.exists(): # here we check if has a userreg profile if he has we could extra check if he had filled all fields if he passed return him to view
        return view_func(request, *args, **kwargs)
        
       else:
        return redirect('registration') # else he didnt pass if checks redirect him to profil registration page

    return wrapper_func

теперь мы сделали наш декоратор, давайте использовать его во всех представлениях, которые мы хотим ограничить посещение пользователем без заполнения его профиля

# lets import our newly decorator
from .decorators import complete_registration

присвоим декоратор каждому представлению, которое я хочу ограничить от посещения пользователем без заполнения профиля

 @complete_registration
 def viewname(request):
   return

 @complete_registration
  def anotherview(request):
     return
Вернуться на верх