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

44 投票
4 回答
30799 浏览
提问于 2025-04-17 17:47

在自定义Django的管理面板时,我使用了raw_id_fields,这样可以从一个有成千上万条数据的模型中选择外键,因为默认的下拉选择框在这么多选项面前实在不方便。

这个方法是有效的,但它显示的是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 个回答

5

看起来这个插件:https://github.com/lincolnloop/django-dynamic-raw-id

正好能满足你的需求:

(以下内容摘自文档):

使用方法

要在你的应用中开始使用django-dynamic-raw-id,你只需要在你的ModelAdmin类中实现DynamicRawIDMixin,并把想要的字段添加到dynamic_raw_id_fields的列表中:

from dynamic_raw_id.admin import DynamicRawIDMixin

class UserProfileAdmin(DynamicRawIDMixin, admin.ModelAdmin):
    dynamic_raw_id_fields = ('user',)

你还可以在管理界面的过滤器中使用dynamic_raw_id小部件:

from dynamic_raw_id.admin import DynamicRawIDMixin
from dynamic_raw_id.filters import DynamicRawIDFilter

class UserProfileAdmin(DynamicRawIDMixin, admin.ModelAdmin):
    list_filter = (
        ('dynamic_raw_id_fk', DynamicRawIDFilter),
    )
8

我也研究过这个问题,我觉得这是不可能的。我认为你能做的最好的事情就是在原始ID字段旁边显示这个字段的unicode值:http://djangosnippets.org/snippets/2108/

另外,你可以显示unicode值,并提供一个链接,指向该值对应的管理页面:http://djangosnippets.org/snippets/2217/

44

从Django 2.0开始,你可以使用 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

撰写回答