按照documentation可以定義一個get_ordering()
方法使用了動態訂單:
# admin.py
from django.contrib import admin
from .models import StartupType
class StartupTypeAdmin(admin.ModelAdmin):
def get_ordering(self, request):
language_code = request.LANGUAGE_CODE[:2]
return ('name_%s' % language_code,)
admin.site.register(StartupType, StartupTypeAdmin)
這同樣適用get_language()
而不是request.LANGUAGE_CODE
。
如果你還沒有得到正確的語言,請確保您在settings.py
添加的語言環境中間件會話中間件之後,例如:
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
編輯:新增替代定義動態排序在模型上。
如果你也想設置ordering
的模型類,是好像比較複雜一點點位,這是最好的我能想出:
from django.db import models
from django.db.models.options import Options
from django.utils.translation import get_language
from django.utils.translation import ugettext_lazy as _
from transmeta import TransMeta, get_real_fieldname
class TranslatedOptions(Options):
@property
def ordering(self):
lang = get_language()[:2]
return [get_real_fieldname(f, lang) for f in self.orig_ordering]
@ordering.setter
def ordering(self, value):
self.orig_ordering = value
class TransMetaOrdering(TransMeta):
def __new__(cls, name, bases, attrs):
new_class = super(TransMetaOrdering, cls).__new__(cls, name, bases, attrs)
options = TranslatedOptions(None)
for k, v in new_class._meta.__dict__.iteritems():
setattr(options, k, v)
new_class._meta = options
return new_class
class StartupType(models.Model):
__metaclass__ = TransMetaOrdering
name = models.CharField(_("Name"), max_length=30)
slug = models.SlugField(_("Slug"), max_length=30, editable=False)
class Meta:
verbose_name = _("Startup type")
verbose_name_plural = _("Startup types")
translate = (
"name",
)
ordering = (
"name",
)
這將取代StartupType._meta
(類型的對象django.db.models.options.Options
)與一個TranslatedOptions
類型的新對象,這將暴露ordering
作爲一個動態屬性。
嗨NCao!我嘗試使用'get_ordering()',它運行良好! :)我也在'Session'後修正了'Locale'中間件的順序。有沒有一種方法可以在模型中指定「基於活動語言的動態排序」而不是ModelAdmin?我也嘗試使用'get_language()'作爲'search_fields',但它總是返回默認的語言,而不是活動的那個:(你對這些主題有什麼想法?謝謝!:) – Caumons
@Caumons它實際上是可能的來定義模型上的動態排序,雖然很複雜,所以將動態部分委託給視圖可能更容易。 至於'search_fields',我相信'ModelAdmin'上的一個簡單屬性會起作用。它將在'ModelAdmin.changelist_view'內進行評估,因此可以根據需要使用當前語言。 –
感謝您的回答!你是對的,直接在模型中設置排序過於複雜,所以最好將它移動到相應的視圖。我嘗試了使用屬性的'search_fields'的建議,但恐怕這個字段不允許使用可調參數。所以我認爲這是不可能的,只有一種語言(默認)可以搜索。 – Caumons