2013-04-18 36 views
3

我正在研究Django 1.5.1,我想知道以下問題:是否可以在模型中定義可翻譯字段的排序,使用django-transmeta並使用用戶訪問管理員的活動語言?是否可以使用活動語言訂購Django模型?

到目前爲止,我實現了使用轉換的領域,並責令使用默認的語言,而不是積極的一個,作爲呼叫get_language()總是返回settings.py定義,如果我把來自Meta類中的方法默認值(或ModelAdmin類)。

這裏是我工作的代碼,並感謝您的幫助:

class StartupType(models.Model): 

    __metaclass__ = TransMeta 

    name = models.CharField(_("Name"), max_length=30, unique=True) 
    slug = models.SlugField(_("Slug"), max_length=30, unique=True, editable=False) 

    class Meta: 

     verbose_name = _("Startup type") 
     verbose_name_plural = _("Startup types") 
     translate = (
      "name", 
     ) 
     ordering = [ 
      "name_" + LANGUAGE_CODE, 
     ] 

回答

1

按照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作爲一個動態屬性。

+0

嗨NCao!我嘗試使用'get_ordering()',它運行良好! :)我也在'Session'後修正了'Locale'中間件的順序。有沒有一種方法可以在模型中指定「基於活動語言的動態排序」而不是ModelAdmin?我也嘗試使用'get_language()'作爲'search_fields',但它總是返回默認的語言,而不是活動的那個:(你對這些主題有什麼想法?謝謝!:) – Caumons

+0

@Caumons它實際上是可能的來定義模型上的動態排序,雖然很複雜,所以將動態部分委託給視圖可能更容易。 至於'search_fields',我相信'ModelAdmin'上的一個簡單屬性會起作用。它將在'ModelAdmin.changelist_view'內進行評估,因此可以根據需要使用當前語言。 –

+0

感謝您的回答!你是對的,直接在模型中設置排序過於複雜,所以最好將它移動到相應的視圖。我嘗試了使用屬性的'search_fields'的建議,但恐怕這個字段不允許使用可調參數。所以我認爲這是不可能的,只有一種語言(默認)可以搜索。 – Caumons