#django #django-models
#django #django-модели
Вопрос:
Расширенная авторизация пользователя в профиле
class Profile(models.Model):
user = models.OneToOneField(User, null=True, on_delete=models.CASCADE)
age = models.IntegerField(default=18)
university = models.CharField(max_length=100, default='')
department = models.CharField(max_length=50, default='')
Views.py
def register(request):
if request.method == 'POST':
form = UserRegisterForm(request.POST)
profile_form = ProfileForm(request.POST)
if form.is_valid() and profile_form.is_valid():
try:
with transaction.atomic():
form.save()
profile_form.save()
except DatabaseError:
pass
username = form.cleaned_data.get('username')
messages.success(request, f'Account Created for {username}!')
return redirect('jmiforums:homepage')
else:
form = UserRegisterForm()
profile_form = ProfileForm()
return render(request, 'jmiforums/register.html', {"form":form, "profile_form": profile_form,})`
Форма регистрации
<form method="POST">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">JMI Forum</legend>
{{ form.as_p }}
{{ profile_form.as_p }}
</fieldset>
<div class="form-group">
<button class="btn btn-outline-info" type="submit">Sign up</button>
</div>
</form>
Данные сохраняются дважды каждый раз в таблице профилей, один с подключенным пользователем, но без других данных из модели профиля, а другой наоборот.
Комментарии:
1. опубликуйте свой
UserRegisterForm
иProfileForm
2. то, что ответил OP, сработало для меня. Но если вы хотите, я могу опубликовать это для вас?
Ответ №1:
Вероятно, вам не следует разрешать Profile
без user
(удалить null=True
). Предполагая, что вы UserRegisterForm
просто сохраняете User
модель, а ваша ProfileForm
предназначена только для Profile
модели:
if form.is_valid() and profile_form.is_valid():
user = form.save()
profile = profile_form.save(commit=False)
profile.user = user
profile.save()
Вы используете commit=False
для создания экземпляра без его сохранения, затем вы добавляете связь к user
, а затем сохраняете профиль. Также убедитесь, что вы не создаете пустое значение Profile
при создании User
(например, если вы подключили post_save
обработчик User
, как описано в документах Django).