从另一个模型Django添加字段

时间:2012-07-31 16:01:23

标签: 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)

在我的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代码的代码关系。我怎么能做到这一点?

P.D。:对不起我的英文......

很多, 安东尼奥。

3 个答案:

答案 0 :(得分:5)

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

class ModelAInline(admin.StackedInline):
  model = ModelA

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

admin.site.register(ModelA, ModelAAdmin)

现在,在编辑表单上,每个ModelA都有一个ModelBs列表,您可以在其下直接编辑。

(请注意,不应使用unique = True的ForeignKey,而应使用OneToOneField。)

答案 1 :(得分:3)

您可以用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的适用代码列表。

答案 2 :(得分: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”。

非常感谢