Не удается заставить формы Django сохранять данные в модели User и Profile
Я пытаюсь расширить модель Django User путем создания модели профиля пользователя. Мне удается успешно создавать модели, но я не могу получить информацию, введенную в пользовательскую форму UserCreationForm для сохранения данных. Я не могу получить новые формы на той же странице и получить информацию, связанную с пользователем, для сохранения. При попытке я получаю ошибку 'Anonymous User has to data _meta'
models.py
class Profile(models.Model):
'''
periods = [
('-','-'),
('1','1'),
('2','2'),
('3','3'),
('4','4'),
('6','6'),
('7','7'),
]
'''
user = models.OneToOneField(User,on_delete=models.CASCADE)
period = models.IntegerField(default=1)
first_name = models.CharField(max_length=100,default='Home')
last_name = models.CharField(max_length=100,default='Simpson')
def __str__(self):
return f'{self.user.username}'
forms.py
class UserRegisterForm(UserCreationForm):
email = forms.EmailField()
class Meta:
model = User
fields = ['username','email','password1','password2']
class UserProfileForm(forms.ModelForm):
periods = [
(1,1),
(2,2),
(3,3),
(4,4),
(6,6),
(7,7),
]
period = forms.ChoiceField(choices=periods)
first_name = forms.CharField(max_length=100)
last_name = forms.CharField(max_length=100)
class Meta:
model = Profile
fields = ['first_name','last_name','period']
signals.py
@receiver(post_save,sender=User)
def create_profile(sender,instance,created,**kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save,sender=User)
def save_profile(sender,instance,**kwargs):
instance.profile.save()
views.py
def login(request):
context = {
'title':'Login',
}
return render(request,'users/login.html',context)
def register(request):
if request.method == "POST":
form = UserRegisterForm(request.POST)
if form.is_valid():
email = form.cleaned_data.get('email')
email_domain = re.search("@[\w.]+", email)
if email_domain.group() == EMAIL_DOMAIN:
form.save()
username = form.cleaned_data.get('username')
messages.success(request,f'Account created for {username}! You are now able to sign in.')
return redirect('users-login')
else:
messages.error(request,f'Sorry. You are not authorized to register.')
else:
form = UserRegisterForm()
context = {
'title':'Register',
'form':form
}
return render(request,'users/register.html',context)
Это происходит потому, что вы размещаете обе формы на странице регистрации. Если вы не создали ни одного пользователя, как вы можете создать профиль и как вы сможете добавлять или получать данные из него?
Теперь решение для этого есть,
1 . Вы создаете страницу для регистрации пользователя, скажем "users/register.html", когда он успешно зарегистрируется на ней, создаете сигнал для создания профиля для него, затем успешно регистрируете пользователя. Затем перенаправьте только что зарегистрированного пользователя на страницу изменения профиля.
- Примите обе формы на странице регистрации пользователя, но не проверяйте форму изменения профиля .Создайте пользователя в представлении и затем ссылайтесь на него в форме изменения профиля .
Простой бит кода для этого .
def registerUser(request) :
if request.method == "POST" :
user_form = UserRegisterForm(request.POST)
if user_form.is_valid():
username = request.POST.get("username")
# fields you require
user = User(username = username , password = password)
user.save()
profile_field_objects = request.POST.get("profile_field_data")
profile = Profile(user = user , profile_field_objects = profile_field_objects)
profile.save()
# rest you can code