gpt4 book ai didi

django - 在管理员中使 django-parler 字段可排序的首选方法

转载 作者:行者123 更新时间:2023-12-04 21:03:56 25 4
gpt4 key购买 nike

我在几个模型上使用 django-parler。通常,您将 parler 应用于标题、名称等字段,当然您希望能够在 Django 管理中对这些字段进行排序。
我最接近的是通过覆盖 ModelAdmin 上的 queryset 方法,但这似乎是一种非常粗糙的方法。此外,它只设置默认排序,您不能单击标题排序字段。

class MyModelAdmin(TranslatableAdmin):
list_display = ['title', 'language_column']

def get_queryset(self, request):
language_code = settings.LANGUAGE_CODE
qs = Grant.objects.translated(language_code).order_by('translations__title')
return qs

所以问题是:您可以在管理中对翻译的字段进行排序吗?并且您是否必须仅将其显示或硬编码为默认语言并不重要,因为它仅供管理员使用。

最佳答案

这也是我们正在努力的领域。您的示例非常适合排序,因为您使用 .translated(..) 将列表限制为一种语言。 .

要对事物进行排序,您可以遵循标准 ModelAdmin 逻辑,其中过滤列表:

class MyAdmin(TranslatableAdmin):
list_display = ('title_column', ...)

def title_column(self, object):
return object.title
title_column.short_description = _("Title")
title_column.admin_order_field = "translations__title"

def get_queryset(self, request):
# Limit to a single language!
language_code = self.get_queryset_language(request)
return super(MyAdmin, self).get_queryset(request).translated(language_code)

请注意,此代码当前隐藏了所有未翻译的对象!

使用常规查询集,使用 .order_by('translations__title')将不起作用,因为您可以先点击翻译行或后备行。这样的事情只能通过自定义 SQL 来实现。例如:
SELECT project.id,
translation.language_code,
translation.title,
fallback.title,
COALESCE(translation.title, fallback.title) AS order_title
FROM "myapp_project" AS project
LEFT OUTER JOIN "myapp_project_translation" AS translation ON (translation.master_id = project.id AND translation.language_code = 'nl')
LEFT OUTER JOIN "myapp_project_translation" AS fallback ON (fallback.master_id = project.id AND fallback.language_code = 'en')
ORDER BY order_title

混合 .extra()admin_order_field你也许可以让它工作,但使用 .translated()肯定会让事情变得更容易。

关于django - 在管理员中使 django-parler 字段可排序的首选方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29909036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com