【问题标题】:raw_id_fields: How to show a name instead of id?raw_id_fields:如何显示名称而不是 id?
【发布时间】:2013-02-17 20:56:11
【问题描述】:

自定义一个 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',)

【问题讨论】:

标签: python django django-admin


【解决方案1】:

从 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

【讨论】:

  • 哇,我已经在 Django 专业开发五年了,不知何故从未遇到过autocomplete_fields。很棒的功能。
  • 是的,这一定是正确的答案。非常酷的功能和内置功能。
【解决方案2】:

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

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

【讨论】:

  • 感谢您的回答。我已经尝试了最后一个 sn-p,但是当我保存结构并再次打开它时,它只显示 unicode 和链接。当我选择 raw_id 时,您知道如何显示相同的内容吗?
  • @A.Vila 我也有同样的行为,你还有其他选择吗?
【解决方案3】:

好像这个插件: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),
    )

【讨论】:

  • @coup 关于您的suggested edit “将沙门氏菌更改为dynamic_raw_id”,非常值得添加为什么,建议的编辑审阅者不一定会去要调查你为什么要做出这样的改变,下次可能会根据文档提及 “沙门氏菌重命名为 dynamic_raw_id” 的内容。正如您从链接中看到的那样,您的编辑确实因与用户写的内容冲突而获得了 1 票拒绝投票,这可能是因为编辑无法理解为什么您进行了更改。
【解决方案4】:

对于一个对象的表示,使用__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):

【讨论】:

  • 感谢您的回答。我已经用过 unicode。我已经用我在模型中使用的代码更新了这个问题。也许我错过了什么......
  • “结构”是您的 FK 表吗?您需要 FK 模型上的 unicode。
  • 是的,它本身就是 TreeForeignKey:parent = TreeForeignKey('self', [...] )
  • 我有同样的问题,但__unicode__ 没有解决它,id 仍然显示。有什么线索吗?谢谢!
  • unicode 也不能解决我的问题。在这里使用python3和django1.7。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 2021-03-01
相关资源
最近更新 更多