Как сохранить данные формы в разных моделях с однозначным отношением в Django - PullRequest
2 голосов
/ 15 октября 2010

Это на самом деле продолжение предыдущего вопроса .

Данные профиля пользователя распределены по нескольким различным моделям, например:

# Simplified versions, actual classes contain many more fields.

class Profile(models.Model):  # returned by Django's User.get_profile()
    user = models.OneToOneField(User)  

    home_address = models.OneToOneField(Address)
    work_address = models.OneToOneField(Address)

    language = models.CharField(max_length=20)

class Address(models.Model):
    street = models.CharField(max_length=100)
    city = models.CharField(max_length=100)

... и Джанго User, конечно.

Я хочу, чтобы пользователь ввел все данные своего профиля в одном представлении, в частности эти данные:

  • имя пользователя (пользователь)
  • электронная почта (пользователь)
  • язык (профиль)
  • home_address.street (Address)
  • home_address.city (Адрес)
  • work_address.street (Address)
  • work_address.city (Адрес)

Итак, что было бы самым простым / Django способом

  1. построить такую ​​форму?
  2. вывести форму в шаблоне?
  3. обрабатывать входящие данные формы, разбивать их на разные модели и создавать необходимые объекты (например, User, Profile и 2 Address объекты)?

Ответы [ 2 ]

1 голос
/ 15 октября 2010

Я думаю, что вы находитесь в той точке, где для настройки моделей и наборов форм потребуется больше работы, чем вы сэкономите, используя их. Таким образом, я бы использовал стандартную (не модель) форму, определял типы полей вручную и сохранял их все в соответствующих моделях в явном виде - либо в представлении, либо определяя собственный метод save () в форме и вызывая его .

0 голосов
/ 15 октября 2010

Наиболее практичным способом, я думаю, является использование modelForm и formsets ...

Вы можете использовать форму модели для создания форм из модели. Документы здесь .... Вы можете использовать встроенный набор форм для простого создания форм и сохранения данных ... Документ здесь ...

Но, конечно, связанные модели должны иметь иностранный ключ для пользователя или профиля. Структура вашей модели может не подходить, потому что, насколько я знаю, встроенная модель должна иметь чужой ключ к другому, поэтому на данный момент ваш внешний ключ к профилю должен быть в модели адреса ... Но, как я сказал, я не уверен. Вы можете попробовать ...

Поскольку у вас есть правильные отношения foreignKey, вы можете использовать встроенные наборы форм с modelform, чтобы создать форму из многих моделей ...

РЕДАКТИРОВАТЬ:

Насколько я понимаю, вы можете использовать модельные формы (без наборов форм) и легко добавить свою форму в шаблон. Но в функции просмотра, которая будет обрабатывать публикуемые данные, вы должны вручную устанавливать внешние соединения «один к одному». Как:

home = Address.objects.create(...)
work = Address.objects.create(...)
Profile.objects.create(home_address=home, work_address=work,...)

Или вы можете изменить свои модели:

class Profile(models.Model):  # returned by Django's User.get_profile()
    user = models.OneToOneField(User)  
    language = models.CharField(max_length=20)

class Address(models.Model):
    profile = models.ForeignKey(Profile)
    street = models.CharField(max_length=100)
    city = models.CharField(max_length=100)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...