Как создать представление, сохраняющее объекты User и UserProfile в Django

У меня есть две модели в Django: User (предварительно определенная Django) и UserProfile. Эти два связаны через внешний ключ.

models.py:

class UserProfile(models.Model):
  user = models.ForeignKey(User, unique=True, related_name="connect")
  location = models.CharField(max_length=20, blank=True, null=True)

Я использую UserCreationForm (предопределенный Django) для модели пользователя и создал другую форму для UserProfile в forms.py

#UserCreationForm for User Model

class UserProfileForm(ModelForm):
  class Meta:
    model = UserProfile
    exclude = ("user", )

Я загружаю обе эти формы в шаблон registration.html, чтобы клиент веб-сайта мог ввести данные о полях, содержащихся в обеих моделях (например, «first_name», «last_name» в модели User, «location» в модели UserProfile).

Да хоть убей, я не могу понять, как создать представление для этой регистрационной формы. То, что я пробовал до сих пор, создаст объект User, но не будет связывать другую информацию, такую ​​как местоположение, в соответствующем объекте UserProfile. Может кто-нибудь мне помочь? Вот что у меня сейчас есть:

def register(request):
  if request.method == 'POST':
    form1 = UserCreationForm(request.POST)
    form2 = UserProfileForm(request.POST)
    if form1.is_valid():
      #create initial entry for User object
      username = form1.cleaned_data["username"]
      password = form1.cleaned_data["password"]
      new_user = User.objects.create_user(username, password)

      # What to do here to save "location" field in a UserProfile 
      # object that corresponds with the new_user User object that 
      # we just created in the previous lines

  else:
    form1 = UserCreationForm()
    form2 = UserProfileForm()
  c = {
    'form1':UserCreationForm,
    'form2':form2,
  }
  c.update(csrf(request))
  return render_to_response("registration/register.html", c)

person goelv    schedule 12.08.2012    source источник
comment
stackoverflow.com/ вопросы / 569468 /   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 13.05.2016


Ответы (1)


Почти готово :)

def register(request):
    if request.method == 'POST':
        form1 = UserCreationForm(request.POST)
        form2 = UserProfileForm(request.POST)
        if form1.is_valid() and form2.is_valid():
            user = form1.save()  # save user to db
            userprofile = form2.save(commit=False)  # create profile but don't save to db
            userprofile.user = user
            userprofile.location = get_the_location_somehow()
            userprofile.save()  # save profile to db

    else:
        form1 = UserCreationForm()
         form2 = UserProfileForm()
    c = {
      'form1':form1,
      'form2':form2,
    }
    c.update(csrf(request))
    return render_to_response("registration/register.html", c)

Чтобы немного уточнить, form.save() создает экземпляр модели и сохраняет его в db. form.save(commit=False) Просто создает экземпляр, но ничего не сохраняет в БД.

person frnhr    schedule 12.08.2012