Показать models.ManyToManyField как встроенный, с той же формой, что и models.ForeignKey inline - PullRequest
4 голосов
/ 23 марта 2010

У меня есть модель, похожая на следующую (упрощенную):

models.py

class Sample(models.Model):  
    name=models.CharField(max_length=200)  

class Action(models.Model):  
    samples=models.ManyToManyField(Sample)
    title=models.CharField(max_length=200)  
    description=models.TextField()  

Теперь, если бы Action.samples было бы ForeignKey вместо ManyToManyField, когда я отображал Action как TabularInline в Sample в Django Admin, я бы получил несколько строк каждый из которых содержит красивую форму для редактирования или добавления другого Action. Тем не мение; когда я отображаю выше, как встроенный, используя следующее:

class ActionInline(admin.TabularInline):
    model=Action.samples.through

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

Мой вопрос на самом деле: как мне отобразить отношение ManyToMany в виде строки с формой для ввода информации, как описано?

В принципе это должно быть возможно, поскольку, с точки зрения Sample, ситуация в обоих случаях идентична; Каждый Sample имеет список Action с независимо от того, является ли отношение ForeignKey или ManyToManyRelation. Также; На странице администрирования Sample я никогда не хочу выбирать из существующих Action s, только создавать новые или редактировать старые.

1 Ответ

0 голосов
/ 30 апреля 2010

Я понимаю вашу точку зрения, но подумайте о случае, когда вам может понадобиться использовать custom через модель (таблица). В этом случае встроенная форма администратора будет включать поля для этой промежуточной модели, поскольку именно для этой модели вы просили администратора создать форму.

, например

class Person(models.Model):
    name = models.CharField(max_length=128)

class Group(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(Person, through='Membership')

class Membership(models.Model):
    person = models.ForeignKey(Person)
    group = models.ForeignKey(Group)
    date_joined = models.DateField()
    invite_reason = models.CharField(max_length=64)

Администратор должен отобразить форму для модели Memebership, потому что это модель, к которой относится редактируемый экземпляр. В вашем случае сквозная модель содержит только 2 внешних ключа (1 для модели Action и 1 для образца), поэтому отображается только список действий.

Вы можете сделать то, о чем просите, если администратор django поддерживает вложенные строки ( есть открытый запрос об этом).

...