Django:如何在管理窗体中显示外键值

2024-04-25 19:25:21 发布

您现在位置:Python中文网/ 问答频道 /正文

如何让管理表单在django管理表单的下拉列表中显示外键值,而不是显示“table name object”?我正在努力解决这个问题。在

下面是我的模型代码示例(都包含catname字段)。catname在Parent中是PK,在Child中是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')

管理员看起来像:

^{pr2}$

Tags: nameselfchildtruedbreturnmodelsdef
3条回答

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

应用程序名/管理员py在

from django.contrib import admin
from . import models


    class BookAdmin(ModelAdmin):
        list_display = ('name', 'date', 'andwhatnot', 'author_variable')

        def author_variable(self, obj):
            try:
                return self.author.blankablevariable
            except:
                pass

admin.site.register(models.Book, BookAdmin)

希望它能帮助有同样问题的人。如果使用pass-in-except是不受欢迎的-我很乐意听到。说我是新来的太夸张了。在

AdminSelect小部件正在显示相关模型的__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使用的form,甚至可以用ModelAdmin.formfield_overrides更改一个字段。在

阅读文档here

相关问题 更多 >