当前位置: 首页 > news >正文

django parler 使用教程

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, 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
http://www.lryc.cn/news/587532.html

相关文章:

  • Foundry 私钥管理指南:方法与安全最佳实践
  • es的自定义词典和停用词
  • aspnetcore Mvc配置选项中的ModelMetadataDetailsProviders
  • 幻想读 通过多版本并发控制(MVCC)和间隙锁(Gap Lock)的组合也能防止幻读具体说下
  • 基于R语言的极值统计学及其在相关领域中的实践技术应用
  • Linux RDMA Maillist patchsets (Jul. 7 - Jul. 13, 2025)
  • 【LeetCode240.搜索二维矩阵Ⅱ】以及变式
  • 传统机器学习在信用卡交易预测中的卓越表现:从R²=-0.0075到1.0000的华丽转身
  • 【Hadoop科普篇】大数据怎么处理?Hadoop是什么?跟HDFS, Spark, Flink, Hive, Hbase是什么关系?
  • React Three Fiber 实现 3D 模型视图切换、显隐边框、显隐坐标轴
  • JavaScript 性能优化实战:深入性能瓶颈,精炼优化技巧与最佳实践
  • 如何彻底解决PLM/ERP/MES等系统访问速度慢问题?
  • ThinkPHP 8 在 Apache 下启用伪静态
  • .NET 9 GUID v7 vs v4:时间有序性如何颠覆数据库索引性能
  • 【python实用小脚本-139】Python 在线图片批量下载器:requests+PIL 一键保存网络图像
  • Docker 拉取镜像并离线迁移至云桌面指南(以Redis为例)
  • 2025 春秋杯夏季个人挑战赛 Web
  • Spark SQL 之 UT
  • 实战:如何创建 AWS RDS 数据库
  • Android 16k jni修改
  • 构建高效事件驱动架构:AWS S3与SQS集成实践指南
  • 如何连接 AWS RDS 数据库实例
  • AWS RDS PostgreSQL可观测性最佳实践
  • 2025最新android面试指南
  • (三)OpenCV——图像形态学
  • 爬虫-爬取豆瓣top250
  • Android 16系统源码_窗口动画(一)窗口过渡动画层级图分析
  • Android编译系统——基础介绍(一)
  • LVS集群技术
  • 17.Python 中的相等性比较:== vs is