从另一个模型添加字段Django。

5
我有以下模型(这只是一个例子,不是真的):
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)

在我的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)

我会制作类似于以下内容的东西:
class ModelBAdmin(admin.ModelAdmin):
   list_display = ('name', 'code')

代码必须是从ModelA-code的代码关系中派生出来的。我该如何做到这一点?
注:抱歉我的英语不好...
非常感谢, 安东尼奥

1
ModelB没有与ModelA单一相关的代码,因为它是一对多的关系 - 将有许多相关的代码。您想要显示什么? - Daniel Roseman
我想展示ModelA的代码,因为每个ModelA都必须有一个ModelB,但是如果我想从Adminsite编辑ModelB,很难找到它。 - antonio
是的,每个ModelA都必须有一个ModelB,但这意味着每个ModelB有许多个ModelA。再次问一下,您想要显示什么? - Daniel Roseman
@antonio:当一个 ModelB 实例被 10 个 ModelA 实例引用时,你会显示什么? - vartec
只需将其替换为OneToOneField即可:https://docs.djangoproject.com/en/dev/ref/models/fields/#onetoonefield - vartec
显示剩余2条评论
3个回答

9

你的评论表明你实际上对列表展示并不感兴趣,而是对编辑感兴趣。为此,您应该使用内联表单:

class ModelAInline(admin.StackedInline):
  model = ModelA

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

admin.site.register(ModelA, ModelAAdmin)

现在,在编辑表单上,每个 ModelA 下面都有一个 ModelB 列表,您可以直接在那里进行编辑。
(请注意,与使用唯一的 ForeignKey 不同,您应该使用 OneToOneField。)

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

由于一个 ModelB 可以连接到多个 ModelA 项上,所以您可能需要返回指定 ModelB 的适用代码列表。


3
感谢 @vartec、@DanielRoseman 和 @Tisho。 最终,在你们的建议下,我完成了下面的代码(虽然我认为它并不是非常高效...但是其他方法会出错...)。
class SubvencionCAAdmin(admin.ModelAdmin):
  search_fields = ['nombre', 'tipo', 'resumen']

  def Subvencion_Code(self):
      lista_subvenciones = Subvencion.objects.all()
      for subvencion in lista_subvenciones :
            if (self.nombre == subvencion.CA.nombre):
                return subvencion.codigo

  list_display = ('nombre', Subvencion_Code)

SubvencionCAAdmin 相当于 "ModelB",而 Subvencion 是 "ModelA"。非常感谢。

1
如果这些答案对您有帮助(似乎是这样),您也可以给它们点赞并接受其中一个。 - Tisho
1
@Tisho,我不能给这个答案点赞,因为我只有10的声望值...最低点赞要求是15。 - antonio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接