从另一个模型Django添加字段

ant*_*nio 2 python django admin

我有以下模型(一个例子,不是一个真正的例子):

class ModelB(models.Model):
  name = models.CharField(max_length=50)

  def __str__(self):
    return self.name

class ModelA(models.Model):
  code = models.CharField(max_length=50, unique=True, help_text="Code unique")
  foreignkey = models.ForeignKey(ModelB, unique=True)
Run Code Online (Sandbox Code Playgroud)

在我的admin.py中,我有:

class ModelBAdmin(admin.ModelAdmin):
  list_display = ('name',)

class ModelAAdmin(admin.ModelAdmin):
  list_display = ('code', 'foreignkey')

admin.site.register(ModelA, ModelAAdmin)
admin.site.register(ModelB, ModelBAdmin)
Run Code Online (Sandbox Code Playgroud)

我会做类似的事情:

class ModelBAdmin(admin.ModelAdmin):
   list_display = ('name', 'code')
Run Code Online (Sandbox Code Playgroud)

该代码必须是来自ModelA代码的代码关系。我该怎么做?

PD:对不起,我的英语...

非常感谢,安东尼奥。

Dan*_*man 5

您的评论表明,您真正感兴趣的根本不是列表显示,而是编辑。为此,您应该使用内联表格:

class ModelAInline(admin.StackedInline):
  model = ModelA

class ModelBAdmin(admin.ModelAdmin):
  list_display = ('name',)
  inlines = [ModelAInline]

admin.site.register(ModelA, ModelAAdmin)
Run Code Online (Sandbox Code Playgroud)

现在,在编辑表单上,每个ModelA都有一个ModelB列表,您可以在下面直接进行编辑。

(请注意,您可能不应该使用OneToOneField来代替使用unique = True的ForeignKey。)


Tis*_*sho 4

您可以通过以下方式定义自定义项目list_display

class ModelBAdmin(admin.ModelAdmin):

    def modelA_Codes(self, inst):
        return ','.join([b.code for b in inst.modela_set.all()])

    list_display = ('name', 'modelA_Codes')
Run Code Online (Sandbox Code Playgroud)

由于一个 modelB 可以附加到多个 modelA 项,因此您可能需要返回指定 ModelB 的适用代码列表。