我在几个模型上使用django-parler。通常,您将parler应用于类似title、name等字段,当然,您希望能够在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因此,问题是:您能使已翻译的字段在管理中排序吗?如果您只需要将其显示或硬编码到默认语言中,这并不重要,因为它只供管理员使用。
发布于 2015-06-08 10:20:22
这是一个我们也在努力奋斗的领域。您的示例非常适合排序,因为您使用.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()肯定会使事情变得更容易。
https://stackoverflow.com/questions/29909036
复制相似问题