raw_id_fields:如何显示名称而不是id?

时间:2013-03-03 20:05:11

标签: python django django-admin

自定义Django Admin面板,我正在使用raw_id_fields从具有数千个元素的Model中选择ForeignKey,因为默认的select-box下拉列表对于这么多元素都不方便。

它可以工作,但它显示了在此图像上可以看到的ID: enter image description here

有没有办法显示名称或其他字段而不是ID?或者,有没有比使用raw_id_fields更好的方法来实现这一目标?

这是models.py中的代码:

class Structure(MPTTModel):
    name = models.CharField(max_length=200, unique=True, verbose_name = _('name'))
    parent = TreeForeignKey('self', null=True, blank=True, related_name='children', verbose_name = _('parent'))

    def __unicode__(self):
        return u"%s" % (self.name)

admin.py

class StructureAdmin(tree_editor.TreeEditor):
    search_fields = ('name',)
    raw_id_fields = ('parent',)

4 个答案:

答案 0 :(得分:6)

我也研究了这个,我认为不可能。我认为您可以做的最好的事情是在原始ID字段旁边显示字段的unicode:http://djangosnippets.org/snippets/2108/

或者,您可以显示unicode以及指向该值的相应管理员更改页面的链接:http://djangosnippets.org/snippets/2217/

答案 1 :(得分:3)

看来这个插件:https://github.com/lincolnloop/django-salmonella

做你想做的事:

(从文档中复制):

用法

要在您的应用程序中开始使用django-salmonella所有您需要做的就是在ModelAdmin类中实现SalmonellaMixin并将所需的字段添加到salmonella_fields列表中:

from salmonella.admin import SalmonellaMixin

class UserProfileAdmin(SalmonellaMixin, admin.ModelAdmin):
    salmonella_fields = ('user',)

您也可以在管理过滤器中使用沙门氏菌小部件:

from salmonella.admin import SalmonellaMixin
from salmonella.filters import SalmonellaFilter

class UserProfileAdmin(SalmonellaMixin, admin.ModelAdmin):
   list_filter = (
       ('salmonella_fk', SalmonellaFilter),
   )

答案 2 :(得分:3)

django2.1中,您可以使用autocomplete_fields。它将像ajax select2一样工作。

admin.py

class StructureAdmin(tree_editor.TreeEditor):
    search_fields = ('name',)
    autocomplete_fields = ('parent',)

参考:https://docs.djangoproject.com/en/2.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.autocomplete_fields

答案 3 :(得分:0)

对于对象的表示,请使用__unicode__

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)

    def __unicode__(self):
        return u'%s %s' % (self.first_name, self.last_name)

在Python 3中使用

def __str__(self):