37

自定义 Django 管理面板,我raw_id_fields用来从具有数千个元素的模型中选择一个 ForeignKey,因为默认的选择框下拉列表不方便有这么多元素。

它可以工作,但它显示了可以在这张图片上看到的 id: 在此处输入图像描述

有什么方法可以显示名称或其他字段而不是 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

4 回答 4

30

从 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

于 2019-01-24T07:20:32.327 回答
8

我也研究过这个,我认为这是不可能的。我认为你能做的最好的就是在原始 id 字段旁边显示该字段的 unicode:http: //djangosnippets.org/snippets/2108/

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

于 2013-03-19T21:50:54.983 回答
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),
    )
于 2017-01-19T11:03:58.990 回答
2

用于表示对象使用__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):
于 2013-03-03T20:30:25.443 回答