Django:如何在管理表单中显示外键值

时间:2015-06-10 14:18:18

标签: python django

如何让管理表单在django管理表单的下拉列表中显示外键值,而不是显示表名对象'?我正在努力解决这个问题。

以下是我的模型代码示例(两者都包含catname字段.catname是父级的PK,而子级是FK)。

Parent(models.Model):
catname = models.CharField(db_column='catname', primary_key=True, max_length=255, verbose_name="catname")  
description = models.CharField(db_column='Description', max_length=255, blank=True, null=True)

class Meta:
    managed = False
    db_table = 'Parent'
    verbose_name_plural = ('Parent')

    #def __unicode__(self): return self.catname.catname
    def __str__(self):
        return '%s' % (self.catname)



class Child(models.Model):
    description = models.CharField(db_column='VarDescription', max_length=255, blank=True, null=True)  
    cname = models.CharField(db_column='VarName', primary_key=True, max_length=255) 
    catname = models.ForeignKey(Parent, db_column='catname', blank=True, null=True) 
    def __unicode__(self):
        return self.name
    def child_cat(self):
        return self.catname.catname
    class Meta:
        managed = False
        db_table = 'Child'
        verbose_name_plural = ('Child')

管理员看起来像:

from django.contrib import admin

from Library.models import Parent, Child
# Register your models here.

class ChildAdmin(admin.ModelAdmin):
    list_display = ('cname','description','child_cat')
    fields=('cname','description','child_cat')
    search_fields = ('cname','description')
    ordering = ('cname',)

admin.site.register(Child,ChildAdmin)

3 个答案:

答案 0 :(得分:0)

您可以覆盖form使用的ModelAdmin,或者甚至只使用ModelAdmin.formfield_overrides更改一个字段。

阅读文档here

答案 1 :(得分:0)

admin select小部件显示相关模型的__unicode__()方法。您可以覆盖__unicode__()方法来显示密钥,但这可能不是最佳方式,因为它会出现在其他地方使用__unicode__()

如果您使用的是ModelAdmin,一个选项是在ModelAdmin中定义一个callable,它返回您想要查看的值,并将该callable添加到ModelAdmin的list_display。例如,如果您的模型为Book,并且您希望查看Author的外键值,则可以执行以下操作:

class BookAdmin(ModelAdmin):
    def author_pk(self, obj):
        return self.author.pk

    list_display = (
        'name',
        'author_pk',
    )

另一种选择是使用ModelAdmin.raw_id_fields属性,但这会将窗口小部件的默认行为更改为输入而不是选择。

答案 2 :(得分:0)

问题可能与允许catname中的null和空值有关。经过一个小时的搜索,我终于明白了为什么那些适用于其他人(但OP)的代码对我来说并不起作用。我通过一个简单的尝试/除了:

来解决它

应用程序名称/ admin.py

Dim startPoint As Point = New Point(12, Me.AutoScrollPosition.Y + 80)  

希望能帮到遇到同样问题的人。如果使用传球,除了是不赞成的东西 - 我会很高兴听到。说我是新的是夸大其词。