3

我正在研究 Django 1.5.1,我想知道以下问题:是否可以在可翻译字段的模型中定义排序,使用django-transmeta和使用用户正在访问管理员的活动语言?

到目前为止,我实现了使用翻译字段并使用默认语言而不是活动语言进行排序,因为如果我从 Meta 类(或从 ModelAdmin 类)调用方法,调用get_language()总是返回定义的默认值。settings.py

这是我正在处理的代码,感谢您的帮助:

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,
        ]
4

1 回答 1

2

根据文档,您可以定义一种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.

如果您仍然没有获得正确的语言,请确保您在 Session 中间件之后settings.py添加了 Locale 中间件,例如:

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.OptionsTranslatedOptionsordering

于 2013-04-18T21:35:49.603 回答