2012-07-31 56 views
2

我有后续型号(例如,没有真正一个):从另一个模型添加字段的Django

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代码的代码关系。我如何做到这一点?

Pd积:对不起,我的英语...

THX了很多, 安东尼奥。

+1

ModelB没有从MODELA一个相关的代码,因为它是一个一对多的关系 - 会有很多相关的代码。你想展示什么? – 2012-07-31 16:06:40

+0

我想显示来自ModelA的代码,因为每个ModelA都必须有ModelB,但是如果我想从Adminsite编辑ModelB并不容易找到它。 – antonio 2012-07-31 16:15:11

+0

是的,每个ModelA都必须有一个ModelB,但这意味着每个ModelB都有*许多* ModelAs。再次,你想展示什么? – 2012-07-31 16:19:15

回答

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

+0

非常感谢,非常有用。 – antonio 2012-07-31 17:20:09

4

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

class ModelAInline(admin.StackedInline): 
    model = ModelA 

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

admin.site.register(ModelA, ModelAAdmin) 

现在,编辑表单,每个MODELA具有ModelBs其下您可以编辑直接出现的列表。

(请注意,而不是使用具有独特= True,则应该使用一个OneToOneField一个ForeignKey)

+0

非常感谢,非常有用。 – antonio 2012-07-31 17:20:01

1

感谢@vartec,@DanielRoseman和@Tisho。 最后,您suggesions我已经做下一个(我认为不,它的效率非常高。但其他方法引发错误...)

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 2012-07-31 18:07:50

+1

@Tisho我不能满意答案,我只有10个声望...最多upvote是15。 – antonio 2012-07-31 22:00:59

相关问题