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

mis*_*aba 3 sorting django django-admin

我在几个型号上使用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
Run Code Online (Sandbox Code Playgroud)

所以问题是:你能在管理员中翻译翻译的字段吗?如果您必须仅将其显示或硬编码为默认语言并不重要,因为它仅供管理员使用.

vdb*_*oor 6

这是我们正在努力争取的领域.您的示例非常适合排序,因为您将列表限制为使用单一语言.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 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)
Run Code Online (Sandbox Code Playgroud)

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


使用常规查询集时,使用.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
Run Code Online (Sandbox Code Playgroud)

混合使用.extra()并且admin_order_field您可能能够使其工作,但使用.translated()肯定会使事情变得更容易.