【问题标题】:Django: How to display foreign key value in admin formDjango:如何以管理形式显示外键值
【发布时间】:2015-06-10 14:18:17
【问题描述】:

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

这是我的模型代码示例(都包含 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')

管理员看起来像:

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)

【问题讨论】:

  • 能否发下相关型号和形式代码?
  • 这是我的模型代码示例(都包含 catname 字段,catname 在 Parent 中是 PK,在 Child 中是 FK)。

标签: python django


【解决方案1】:

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

阅读文档here

【讨论】:

    【解决方案2】:

    管理员选择小部件正在显示相关模型的__unicode__() 方法。您可以覆盖 __unicode__() 方法来显示密钥,但这可能不是最好的方法,因为它会出现在其他任何使用 __unicode__() 的地方。

    如果您使用的是 ModelAdmin,一种选择是在您的 ModelAdmin 中定义一个可调用对象,该可调用对象返回您希望查看的值,并将该可调用对象添加到您的 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 属性,但是这会将小部件的默认行为更改为输入而不是选择。

    【讨论】:

    • 尝试使用我的代码执行此操作,但没有成功。我在上面提供了我的模型和管理员的示例..
    【解决方案3】:

    问题可能与在 catname 中允许 null 和空白值有关。经过一个小时的搜索,我终于明白为什么适用于其他所有人(但 OP)的代码对我不起作用。我通过一个简单的 try/except 解决了这个问题:

    appname/admin.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 是不受欢迎的 - 我会很高兴听到。说我是新手是夸大其词。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 2013-10-12
      • 2011-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-19
      相关资源
      最近更新 更多