【发布时间】:2019-05-30 22:04:12
【问题描述】:
Django 1.11。我有 2 个模型,Foo 和 Bar:
class Foo(models.Model):
name = models.CharField()
class Bar(models.Model):
name = models.CharField()
foo = models.ForeignKey(Foo)
在 Django 管理员的 Foo 详细信息页面中,我在 Foo 详细信息下方列出了所有子 Bars:
@admin.register(Foo)
class FooAdmin(admin.ModelAdmin):
def bars(self):
html = ''
bs = self.bar_set.all()
for b in bs:
html += '<a href="%s">%s</a><br>' % (reverse('admin:app_bar_change', args=(b.id,)), b.name)
html += '<a href="%s">Add a bar</button>' % (reverse('admin:app_bar_add'))
return html
bars.allow_tags = True
fields = ('name', bars)
readonly_fields = (bars,)
如您所见,我还添加了一个按钮来添加新的Bar。这可行,但我想要的是在添加新的Bar 时自动预填充Foo 下拉列表。 IE。我想在当前打开的Foo 中添加一个Bar。我如何在 Django 中做到这一点?
【问题讨论】:
-
您可以使用InlineModelAdmin.show_change_link 链接到每个内联的更改页面。如果您不想使用内联,最好让
bar中的外键指向foo而不是相反,这将自动使用必要的小部件和javascript 插件来实现此功能。 -
@raratiru 据我了解,
bar中的外键已经指向foo,不是吗? -
确实!我的意思是相反的,从
foo指向bar的外键。从 Django 2.0 开始,还有一个名为autocomplete_fields的新功能。你仍然可以随意修改并实现你想要的,甚至覆盖ModelForm并定义一个ModelMultipleChoiceField,但我不确定它是否值得,即使它有效。 -
我切换外键的问题是
Foo可以有很多Bars。不过感谢您的建议! -
我会在家里尝试一下,看看在 ModelForm 中定义一个带有多对多小部件的自定义字段是否会产生可行的结果。在
Foo中创建bar = models.ManyToManyField()是不可能的吗?