Поле модели Django для объекта, который является целью ForgeinKeys на других объектах

#python #django #django-forms #django-orm

#python #django #django-формы #django-orm

Вопрос:

У меня есть несколько объектов Django, подобных этому:

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


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

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

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

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

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

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

Однако, есть ли хороший способ ‘django’ сделать это автоматически? т. Е. просто добавить определенное поле в форму, которое сделает все это само? Если бы я изменил книгу.награда должна быть наградой.книги manytomany key это, вероятно, сделало бы все это автоматически, но мне нравится внутренняя логика наличия этого в качестве forgeinkey в книге.

Ответ №1:

Я просто собирался предложить использовать встроенные, но после повторного прочтения вашего вопроса сложная часть — выбрать объекты, которые уже существуют, и связать их с наградой, которую вы редактируете.

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

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