django多语言模型的简单实现。
django-slim的Python项目详细描述
django多语言模型的简单实现。django管理集成是开箱即用的。 支持django localeurl集成。
先决条件
- Django 1.5、1.6、1.7
- Python2.7.+,3.3.+
安装
注意,django 1.5是必需的。不支持早期版本。
- 安装
pypi上的最新稳定版本:
$ pip install django-slim
BitBucket上的最新稳定版本:
$ pip install -e hg+https://bitbucket.org/barseghyanartur/django-slim@stable#egg=django-slim
GitHub上的最新稳定版本:
$ pip install -e git+https://github.com/barseghyanartur/django-slim/@stable#egg=django-slim
- 将slim添加到设置模块的INSTALLED_APPS。
用法和示例
在https://github.com/barseghyanartur/django-slim/tree/stable/example有一个广泛的示例项目 目录。
截图出现在pythonhosted(http://pythonhosted.org/django-slim/#screenshots)的文档中。
演示
为了能够快速评估django slim,我们创建了一个演示应用程序(带有一个快速安装程序) (仅Debian)。按照下面的说明在一分钟内运行演示。
获取最新的django_slim_example_app_installer.sh
$ wget https://raw.github.com/barseghyanartur/django-slim/stable/example/django_slim_example_app_installer.sh
创建新的或切换到现有的虚拟环境,将安装权限分配给安装程序并运行 django slim示例应用install.sh。
$ chmod +x django_slim_example_app_installer.sh
$ ./django_slim_example_app_installer.sh
到前端/后端测试应用程序。
- 前端URL:http://127.0.0.1:8001/en/foo/
- 管理URL:http://127.0.0.1:8001/admin/foo/fooitem/
- 管理员用户名:admin
- 密码:测试
现在让我们一步一步地回顾我们想象中的示例应用程序。
设置.py
将slim添加到已安装的应用程序中。
>>> INSTALLED_APPS = ( >>> # ... >>> 'slim', >>> # ... >>> )
添加语言。
>>> LANGUAGES = ( >>> ('en', gettext("English")), # Main language! >>> ('hy', gettext("Armenian")), >>> ('nl', gettext("Dutch")), >>> ('ru', gettext("Russian")), >>> )
示例/模型.py
>>> from django.db import models >>> >>> from slim import LanguageField, Slim >>> >>> class FooItem(models.Model, Slim): >>> title = models.CharField(_("Title"), max_length=100) >>> slug = models.SlugField(unique=True, verbose_name=_("Slug")) >>> body = models.TextField(_("Body")) >>> language = LanguageField()
示例/admin.py
>>> from django.contrib import admin >>> >>> from slim.admin import SlimAdmin >>> >>> class FooItemAdmin(SlimAdmin): >>> list_display = ('title',) >>> fieldsets = ( >>> (None, { >>> 'fields': ('title', 'slug', 'body') >>> }), >>> ) >>> >>> admin.site.register(FooItem, FooItemAdmin)
示例/视图.py
我们假设语言代码保存在请求对象(建议您使用的django localeurl行为)中。
>>> from slim import get_language_from_request >>> >>> from example.models import FooItem >>> >>> def browse(request, template_name='foo/browse.html'): >>> language = get_language_from_request(request) >>> queryset = FooItem._default_manager.filter(language=language) >>> >>> # The rest of the code
关于orm过滤的更多信息
>>> from example.models import FooItem >>> foo = FooItem._default_manager.all()[0] <FooItem: Lorem ipsum>
假设我们有这样的记录,它已经被翻译成亚美尼亚语(hy)和荷兰语(nl)。原件 翻译名为lorem ipsum。其他的翻译在标题后面附加了语言代码。
>>> armenian_foo = foo.get_translation_for('hy') <FooItem: Lorem ipsum HY> >>> dutch_foo = foo.get_translation_for('nl') <FooItem: Lorem ipsum NL>
如果我们有一个翻译对象,我们总是可以得到主翻译。
>>> armenian_foo.original_translation == foo True
foo:
的所有可用翻译>>> foo.available_translations() [<FooItem: Lorem ipsum HY>, <FooItem: Lorem ipsum NL>]
亚美尼亚语foo的所有可用翻译。
>>> armenian_foo.available_translations() [<FooItem: Lorem ipsum>, <FooItem: Lorem ipsum NL>]
有关工作示例,请参见https://github.com/barseghyanartur/django-slim/tree/stable/example目录。
django localeurl集成
安装
Python2.6.*和2.7.*完全支持Django LocalEurl集成,并自动安装 安装django slim时。如果使用python 3,请安装django localeurl的分叉版本 (因为官方版本还不支持Python3)。
从Bitbucket派生的分叉版本:
$ pip install -e hg+https://bitbucket.org/barseghyanartur/django-localeurl@stable#egg=localeurl
集成
使用slim.models.decorators.auto_prepend_languagedecorator使其工作。
示例(记住我们的footem模型。
>>> from django.core.urlresolvers import reverse >>> >>> from slim.models.decorators import auto_prepend_language >>> >>> class FooItem(models.Model): >>> # Some other code; have in mind previous pieces. >>> @auto_prepend_language >>> def get_absolute_url(self): >>> kwargs = {'slug': self.slug} >>> return reverse('foo.detail', kwargs=kwargs)
不要忘记将LocaleURLMiddleware添加到MIDDLEWARE_CLASSES(作为第一个)。
>>> MIDDLEWARE_CLASSES = ( >>> 'localeurl.middleware.LocaleURLMiddleware', >>> # The rest... >>> )
另外,将localeurl添加到INSTALLED_APPS。
>>> INSTALLED_APPS = ( >>> # Some apps... >>> 'localeurl', >>> # Some more apps... >>> )
许可证
gpl 2.0/lgpl 2.1
支架
如有任何问题,请通过作者部分中提供的电子邮件与我联系。