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