django parler 使用教程

发布于:2025-07-16 ⋅ 阅读:(18) ⋅ 点赞:(0)

1. 什么是 Django Parler?

Django Parler 是一个强大的 Django 插件,用于实现多语言模型字段。它允许你在 Django 模型中定义可翻译的字段,使得每个语言版本的数据能够独立存储和管理。

2. 安装与配置

首先,使用 pip 安装 Django Parler:

pip install django-parler

然后,在你的 Django 项目的 settings.py 中添加 parlerINSTALLED_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, TranslatedFields

class 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 Product

def 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, include

urlpatterns = [
    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 Product

class ProductForm(TranslatableModelForm):
    class Meta:
        model = Product
        fields = ['category', 'price', 'is_active']

10. 性能优化

对于经常访问的多语言内容,可以考虑使用缓存:

from django.core.cache import cache

def 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

网站公告

今日签到

点亮在社区的每一天
去签到