django parler 使用教程
1. 什么是 Django Parler?
Django Parler 是一个强大的 Django 插件,用于实现多语言模型字段。它允许你在 Django 模型中定义可翻译的字段,使得每个语言版本的数据能够独立存储和管理。
2. 安装与配置
首先,使用 pip 安装 Django Parler:
pip install django-parler
然后,在你的 Django 项目的 settings.py
中添加 parler
到 INSTALLED_APPS
:
INSTALLED_APPS = [# ...'parler',# ...
]# 配置语言设置
LANGUAGES = (('en', 'English'),('zh-hans', '简体中文'),('fr', 'French'),
)PARLER_LANGUAGES = {None: ({'code': 'en'},{'code': 'zh-hans'},{'code': 'fr'},),'default': {'fallbacks': ['en'],'hide_untranslated': False,}
}# 设置默认语言
LANGUAGE_CODE = 'en'
3. 创建多语言模型
下面是一个使用 Django Parler 创建多语言模型的示例:
# models.py
from django.db import models
from parler.models import TranslatableModel, TranslatedFieldsclass Category(TranslatableModel):translations = TranslatedFields(name=models.CharField(max_length=100),description=models.TextField(blank=True),)created_at = models.DateTimeField(auto_now_add=True)def __str__(self):return self.safe_translation_getter('name', any_language=True)class Product(TranslatableModel):translations = TranslatedFields(name=models.CharField(max_length=200),description=models.TextField(blank=True),short_description=models.CharField(max_length=255, blank=True),)category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='products')price = models.DecimalField(max_digits=10, decimal_places=2)is_active = models.BooleanField(default=True)created_at = models.DateTimeField(auto_now_add=True)def __str__(self):return self.safe_translation_getter('name', any_language=True)
4. 迁移数据库
创建多语言模型后,需要运行迁移命令来创建相应的数据库表:
python manage.py makemigrations
python manage.py migrate
5. 管理界面集成
要在 Django 管理界面中支持多语言编辑,需要创建自定义的 ModelAdmin:
# admin.py
from django.contrib import admin
from parler.admin import TranslatableAdmin
from .models import Category, Product@admin.register(Category)
class CategoryAdmin(TranslatableAdmin):list_display = ('name', 'created_at')@admin.register(Product)
class ProductAdmin(TranslatableAdmin):list_display = ('name', 'category', 'price', 'is_active', 'created_at')list_filter = ('category', 'is_active', 'created_at')search_fields = ('translations__name', 'translations__description')
6. 在视图和模板中使用
视图中获取当前语言的内容
# views.py
from django.shortcuts import get_object_or_404, render
from .models import Productdef product_detail(request, product_id):product = get_object_or_404(Product, id=product_id)return render(request, 'products/detail.html', {'product': product})
模板中访问翻译字段
<!-- detail.html -->
<!DOCTYPE html>
<html lang="{{ LANGUAGE_CODE }}">
<head><meta charset="UTF-8"><title>{{ product.name }}</title>
</head>
<body><h1>{{ product.name }}</h1><p>{{ product.description }}</p><p>Price: ${{ product.price }}</p><p>Category: {{ product.category.name }}</p><!-- 显示所有可用语言 --><div><h3>Available Languages:</h3><ul>{% get_current_language as LANGUAGE_CODE %}{% get_available_languages as LANGUAGES %}{% get_language_info_list for LANGUAGES as languages %}{% for language in languages %}<li><a href="{% url 'set_language' language.code %}?next={{ request.path }}">{{ language.name_local }} ({{ language.code }})</a>{% if language.code == LANGUAGE_CODE %} (current){% endif %}</li>{% endfor %}</ul></div>
</body>
</html>
7. 查询多语言数据
获取特定语言的翻译
# 获取当前语言的翻译
product = Product.objects.get(id=1)
print(product.name) # 当前语言的名称# 明确指定语言
product.set_current_language('fr')
print(product.name) # 法语名称# 获取所有可用的翻译语言
available_languages = product.get_available_languages()
跨语言查询
# 查询特定语言的内容
Product.objects.translated('zh-hans', name__contains='手机')# 查询至少有一种翻译的产品
Product.objects.active_translations()# 查询所有语言版本
products = Product.objects.all()
for product in products:print(f"ID: {product.id}, Name: {product.name} (当前语言)")print("所有翻译:")for lang_code, lang_name in settings.LANGUAGES:product.set_current_language(lang_code)print(f" {lang_name}: {product.name}")
8. 语言切换
添加语言切换视图到你的 urls.py
:
# urls.py
from django.conf.urls.i18n import i18n_patterns
from django.urls import path, includeurlpatterns = [path('i18n/', include('django.conf.urls.i18n')),# ...
]urlpatterns += i18n_patterns(path('admin/', admin.site.urls),path('', include('products.urls')),# ...
)
9. 表单处理
创建支持多语言的表单:
# forms.py
from django import forms
from parler.forms import TranslatableModelForm
from .models import Productclass ProductForm(TranslatableModelForm):class Meta:model = Productfields = ['category', 'price', 'is_active']
10. 性能优化
对于经常访问的多语言内容,可以考虑使用缓存:
from django.core.cache import cachedef get_cached_product(product_id):key = f'product_{product_id}_{get_language()}'product = cache.get(key)if not product:product = Product.objects.get(id=product_id)cache.set(key, product)return product