1

我有以下型号:

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 之间没有明确的外键关系。其次,我实际上并不想编辑条形对象,我只想从系统中的对象中进行选择。

谢谢。

4

3 回答 3

2

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

如果您需要附加到关系的其他数据,可以使用through参数

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

您需要将 Foo_bar 添加到管理员,以便在管理员中编辑这些附加参数。

于 2010-05-17T23:01:41.143 回答
1

我能想到两种可能:

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

  2. 您可以创建一个自定义 Field 类并将其添加到您的Foo模型中,并通过“post_save”信号对该功能进行分类...

于 2010-05-18T00:14:42.713 回答
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

于 2020-07-13T14:40:04.223 回答