Я создаю Django форму регистрации через User
модель и UserCreationForm
и настроил модель User
для размещения одного определенного пользователем поля contact
.
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
class SignUp(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
Contact = models.TextField(max_length=500, blank=True)
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
SignUp.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
forms.py
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from django import forms
from .models import SignUp
class SignUpForm(UserCreationForm):
email = forms.EmailField()
first_name = forms.CharField(max_length=100)
last_name = forms.CharField(max_length=100)
# phone = format()
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2')
class CustomSignUpPage(forms.ModelForm):
Contact = forms.CharField(max_length=10)
class Meta:
model = SignUp
fields = ('Contact', )
views.py
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login, logout
from django.contrib import messages
#from django.contrib.auth.forms import UserCreationForm
from .forms import SignUpForm, CustomSignUpPage
def home(request):
return render(request, 'authenticate\home.html', {})
def login_user(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
messages.success(request, ('login success'))
return redirect('home')
else:
messages.success(request, ('error while login, please try again'))
return redirect('login')
else:
return render(request, 'authenticate\login.html', {})
def logout_user(request):
logout(request)
messages.success(request, ('logout successful'))
return redirect('home')
# def register_user(request):
# if request.method == "POST":
# form = UserCreationForm(request.POST)
# if form.is_valid():
# form.save()
# username = form.cleaned_data['username']
# password = form.cleaned_data['password1']
# user = authenticate(request, username=username, password=password)
# login(request, user)
# messages.success(request, ('Registration successful'))
# return redirect('home')
# else:
# form = UserCreationForm()
# return render(request, 'authenticate\\register.html', context={'form': form})
def register_user(request):
if request.method == "POST":
form = SignUpForm(request.POST)
cus_form = CustomSignUpPage(request.POST)
if form.is_valid() and cus_form.is_valid():
save1 = form.save()
save1.refresh_from_db()
cus_form = CustomSignUpPage(request.POST, instance=save1.AUTHENTICATION)
cus_form.full_clean()
cus_form.save()
username = form.cleaned_data['username']
password = form.cleaned_data['password1']
user = authenticate(request, username=username, password=password)
login(request, user)
messages.success(request, f'Registration successful')
return redirect('home')
else:
messages.error(request, f'Please correct the error below.')
else:
form = SignUpForm()
cus_form = CustomSignUpPage()
return render(request, 'authenticate\\register.html', context={'form': form, 'cus_form': cus_form})
Однако записанный мной сигнал, похоже, не работает. Я следил за блогом, который находится ниже:
https://simpleisbetterthancomplex.com/tutorial/2016/07/22/how-to-extend-django-user-model.html
Всякий раз, когда я заполняю форму, я получаю сообщение об ошибке ниже:
AttributeError at /auth/register/
'User' object has no attribute 'profile'
Ниже приведены полные журналы трассировки:
Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/auth/register/
Django Version: 3.0.5
Python Version: 3.8.2
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'phone_field',
'AUTHENTICATION']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback (most recent call last):
File "C:\Python38\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "C:\Python38\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:\Python38\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\anshu\djago-project\SkoolSkill\AUTHENTICATION\views.py", line 50, in register_user
save1 = form.save()
File "C:\Python38\lib\site-packages\django\contrib\auth\forms.py", line 137, in save
user.save()
File "C:\Python38\lib\site-packages\django\contrib\auth\base_user.py", line 66, in save
super().save(*args, **kwargs)
File "C:\Python38\lib\site-packages\django\db\models\base.py", line 745, in save
self.save_base(using=using, force_insert=force_insert,
File "C:\Python38\lib\site-packages\django\db\models\base.py", line 793, in save_base
post_save.send(
File "C:\Python38\lib\site-packages\django\dispatch\dispatcher.py", line 173, in send
return [
File "C:\Python38\lib\site-packages\django\dispatch\dispatcher.py", line 174, in <listcomp>
(receiver, receiver(signal=self, sender=sender, **named))
File "C:\Users\anshu\djago-project\SkoolSkill\AUTHENTICATION\models.py", line 17, in save_user_profile
instance.profile.save()
Exception Type: AttributeError at /auth/register/
Exception Value: 'User' object has no attribute 'profile'
Я загрузил проект на Google Drive со ссылкой ниже, на всякий случай, если кто-то захочет его протестировать.
https://drive.google.com/file/d/1COB3BBoRb95a85cLi9k1PdIYD3bmlnc0/view?usp=sharing
Мое окружение:
Джанго == 3.0.5 python 3.8.2
Не уверен, что это ошибка. Пожалуйста, помогите