Django ModelField для объекта, который является целью ForgeinKeys для других объектов - PullRequest
1 голос
/ 08 июня 2011

У меня есть несколько объектов Django, таких как:

class Award(Model):
  name = CharField(...)
  date = DateTimeField(...)


class Book(Model):
  name = CharField(...)
  award = ForgeinKey(Award, blank=True)

(т.е. каждая книга может иметь или не иметь одну награду)

Я хочу создать форму для добавления / редактирования премий.Предположим, много книг уже создано.Первоначально я создал ModelForm следующим образом:

class AwardForm(ModelForm):
    class Meta:
      model = Award

, который создал правильную форму со всеми данными, однако не было возможности добавить книги к награде (или пометить эту награду как применимую к книгам, которые былиselected).

Я собирался вручную добавить ModelMultipleChoiceField к AwardForm (с набором запросов для книг), затем добавить логику в is_valid, которая будет проверять выбранные книги, и добавить что-тона save, чтобы пройти через выбранные Книги и установить для этого объекта ключ фальсификации.

Однако, есть ли хороший способ 'django' сделать это автоматически?т.е. просто добавить в форму определенное поле, которое само это сделает?Если бы я изменил Book.award на многозначный ключ Award.books, он, вероятно, сделал бы все это автоматически, но мне нравится внутренняя логика того, чтобы это было подделкой в ​​Книге.

1 Ответ

0 голосов
/ 08 июня 2011

Я просто собирался предложить использовать Inline's, но после перечитывания вашего вопроса сложная часть - это выбрать уже существующие объекты и связать их с Премией, которую вы редактируете.

То, что вы предложили, - это первый способ, которым я бы это сделал, и единственный другой способ, который я могу придумать, - это взломать некоторые методы на вашем AwardAdmin, чтобы добавить желаемую функциональность.

Хотя использование ModelMultipleChoiceField кажется довольно чистым способом сделать это, если честно, тем более что вам не нужно много / никакого редактирования метода сохранения, поскольку поле должно обрабатывать это само?

...