Не удается правильно сохранить данные с помощью расширенной пользовательской модели

#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).