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

时间:2010-05-17 22:32:29

标签: django django-admin modeladmin

我有以下型号:

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)
    ...

在管理员中,我想要它,以便在Foo更改/添加页面中,您可以指定一个Bar对象,并且在保存时我想创建一个Foo_bar对象来表示关系。如何通过自定义管理站点/ ModelAdmins来完成此操作?请注意,内联不是我需要的,因为foo和bar之间没有明确的外键关系。其次,我实际上并不想编辑条形对象,我只想从系统中的对象中进行选择。

感谢。

3 个答案:

答案 0 :(得分: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才能在管理员中修改这些附加参数。

答案 1 :(得分:1)

我可以想到两种可能性:

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

  2. 您可以创建自定义Field类并将其添加到Foo模型中,并通过'post_save`信号对此功能进行分类...

答案 2 :(得分:0)

对于那些实际希望添加不相关的模型字段以进行添加/更改的人,请使用ModelChoiceField

from django import forms

class CustomForm(forms.Form):
    foo = forms.ModelChoiceField(queryset=Foo.objects.all())
    bar = forms.ModelChoiceField(queryset=Bar.objects.all())

然后只需将表单添加到ModelAdmin的add_form / change_form