使 django-parler 字段在管理中可排序的首选方法
Preferred way to make django-parler fields sortable in admin
我在多个型号上使用 django-parler。通常,您将 parler 应用于标题、名称等字段,当然您希望能够在 Django 管理中对这些字段进行排序。
我最接近的做法是覆盖 ModelAdmin 上的查询集方法,但这似乎是一种非常粗糙的方法。此外,它仅设置默认排序,您不能 click-header-sort 该字段。
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-parler。通常,您将 parler 应用于标题、名称等字段,当然您希望能够在 Django 管理中对这些字段进行排序。 我最接近的做法是覆盖 ModelAdmin 上的查询集方法,但这似乎是一种非常粗糙的方法。此外,它仅设置默认排序,您不能 click-header-sort 该字段。
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()
肯定会让事情变得更简单。