Добавление встроенных в многие объекты в Django admin

Я новичок в Django и прочитал документацию по ее реляционным моделям и встроенным формам администратора (docs on InlineModelAdmin). Я изо всех сил пытаюсь понять, можно сделать следующее из коробки, или если я должен перевернуть свои собственные формы.

Скажем, у меня есть два объекта: "Фильмы и режиссеры", это отношение "многие ко многим", как определено в объявлениях модели следующим образом:

class Film(Model):
    director = ManyToManyField('Director')

Теперь в форме детали для объекта Film я хотел бы добавить встроенные объекты Director (они просто имеют поле имени как единственное свойство). Не только выбор существующих экземпляров, но и возможность создания новых, встроенных в виде объекта Film.

class DirectorInline(admin.TabularInline):
    model = Director
    extra = 3


class FilmAdmin(admin.ModelAdmin):
    inlines = (
        DirectorInline,
        )

Это вызывает ошибку, поскольку она ожидает внешний ключ объекта Director. Является ли то, что я пытаюсь достичь, без создания пользовательской формы, валидатора и т.д.? Любые советы в правильном направлении были бы очень благодарны, спасибо заранее.

Ответ 1

Виджет по умолчанию для поля Много-ко-многим в admin или widgets с атрибутом filter_vertical или filter_horizontal позволяет добавлять новые пункт. Рядом с полем есть зеленый знак "+", чтобы открыть всплывающее окно и добавить новый экземпляр Director.

Но если вам нужен встроенный администратор стиля, вы должны ссылаться на через модель. Если вы не укажете пользовательскую модель, Django создаст простую модель с 2 внешними ключами для директора и фильма.

Итак, вы можете попробовать создать встроенную строку, например

class DirectorInline(admin.TabularInline):
    model = Film.director.through
    extra = 3

Это не приведет к возникновению исключения и создаст встроенную форму, но вам придется выбирать директоров из раскрывающегося списка. Я думаю, вы можете перезаписать это с помощью пользовательской формы.