2010-05-17 75 views
1

我有以下型号:Django admin:我如何将不相关的模型字段添加到模型更改/添加页面?

class Foo(models.Model): 
    field1 = models.IntegerField() 
    ... 

class Bar(models.Model): 
    field1 = models.IntegerField() 
    ... 

class Foo_bar(models.Model): 
    foo = models.ForeignKey(Foo) 
    bar = models.ForeignKey(Bar) 
    ... 

在管理,我想它,以便在富变化/添加页面,你可以指定一个Bar对象,并保存我想创建一个foo_bar这样的名称对象代表关系。我如何通过自定义管理网站/ ModelAdmins来做到这一点?请注意,内联并不是我所需要的,因为foo和bar之间没有明确的外键关系。其次,我实际上并不想编辑栏对象,我只想从系统中选择。

谢谢。

回答

2

你确定你不只想要一个ManyToManyField?在管理员中,这将显示为Bar对象的多选列表。查看User的管理员的组选择部分。

如果您需要连接到关系额外的数据,你可以use a through parameter

class Foo(models.Model): 
    field1 = models.IntegerField() 
    bars = models.ManyToManyField("Bar", related_name="foos", through="Foo_bar") 

你需要foo_bar这样的名称,以便在管理编辑这些额外的参数添加到管理员。

+0

谢谢!如果我在Bar中声明ManyToManyField,是否可以将它显示在Foo中? – Neil 2010-05-18 00:24:04

+0

这就是'related_name'参数的全部内容。使用我的例子,每个'Foo'对象都有一个'bars'字段,它是M2M,并且每个'Bar'对象都有一个'foos'字段,它是反向关系。所以,你把'ManyToManyField'放入哪一个并不重要;你会自动获得两个方向。只是不要把它放在两个模型中,否则会嘲笑你。 – 2010-05-18 02:47:32

+0

同时检查'ForeignKey'文档中描述的'limit_choices_to'参数,以便保持列表大小不变。还有一件事:在管理员中,关系只出现在管理员为声明“ManyToManyField”的模型中。 – 2010-05-18 02:50:33

1

我能想到的两种可能性:

  1. 你可以为你的Foo模型创建一个自定义表单并添加含有Bar.objects.all()查询集到它的字段。然后覆盖ModelAdmin的默认save_form()方法,以在保存对象时创建新的Bar实例。

  2. 您可以创建自定义字段类,它通过'post_save`信号添加到您Foo模式,类此功能...

相关问题