#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, хотя, честно говоря, кажется довольно простым способом сделать это, тем более, что вам не нужно много / какое-либо редактирование метода сохранения, поскольку поле должно обрабатывать это само?