Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使django parler字段在admin中可排序的首选方法_Django_Sorting_Django Admin - Fatal编程技术网

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

使django parler字段在admin中可排序的首选方法,django,sorting,django-admin,Django,Sorting,Django Admin,我在几个型号上使用django parler。通常,您将parler应用于title、name等字段,当然您希望能够在Django admin中对这些字段进行排序。 我最近一次这样做是在ModelAdmin上重写queryset方法,但这似乎是一种非常粗糙的方法。此外,它只设置默认排序,不能单击标题对字段进行排序 class MyModelAdmin(TranslatableAdmin): list_display = ['title', 'language_column']

我在几个型号上使用django parler。通常,您将parler应用于title、name等字段,当然您希望能够在Django admin中对这些字段进行排序。 我最近一次这样做是在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\u by('translations\u 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()
管理订单字段
您可能可以实现这一点,但使用
.translated()
肯定会让事情变得更简单。

感谢您的详细解释!