5

I have the follow Models (an example, not really one):

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)

And in my admin.py I have:

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)

I would make something similar to:

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

The code must be the code-relation from ModelA-code. How I can make this?

P.D.: Sorry for my english...

Thx a lot, Antonio.

4

3 回答 3

8

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

class ModelAInline(admin.StackedInline):
  model = ModelA

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

admin.site.register(ModelA, ModelAAdmin)

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

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

于 2012-07-31T16:25:30.097 回答
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')

由于一个模型B 可以附加到多个模型A 项目,您可能需要返回指定模型B 的适用代码列表。

于 2012-07-31T16:52:19.737 回答
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”。

非常感谢

于 2012-07-31T17:14:41.040 回答