如何使用django-modeltranslation按语言筛选Django项目中的Post文章
操作步骤
1. 配置ModelTranslation翻译字段
你需要在对应APP目录下新建translation.py文件,注册需要翻译的模型字段:
from modeltranslation.translator import register, TranslationOptions from .models import Post @register(Post) class PostTranslationOptions(TranslationOptions): # 指定需要翻译的字段,扩展会自动生成title_en、title_ar、text_en、text_ar等字段 fields = ('title', 'text')
配置完成后执行makemigrations和migrate命令生成对应数据库字段。
2. 确认Django多语言基础配置
在项目settings.py中确保以下配置正确:
# 开启国际化 USE_I18N = True # 配置支持的语言 LANGUAGES = [ ('en', 'English'), ('ar', 'Arabic'), ] # 默认语言 LANGUAGE_CODE = 'en' # 确保LocaleMiddleware在SessionMiddleware之后,CommonMiddleware之前 MIDDLEWARE = [ ... 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.locale.LocaleMiddleware', 'django.middleware.common.CommonMiddleware', ... ]
然后在项目根urls.py中用i18n_patterns包裹业务路由,才能实现ex.com/en/、ex.com/ar/的语言前缀路径生效:
from django.conf.urls.i18n import i18n_patterns urlpatterns = [ # 不需要多语言前缀的路由放此处,比如后台、静态资源 ] urlpatterns += i18n_patterns( path('', home, name='home'), # 其他需要多语言前缀的业务路由放此处 )
3. 视图逻辑适配
情况1:不需要过滤未翻译的文章
如果不需要排除没有对应语言翻译的文章,仅需要返回对应语言的字段内容,原有视图代码不需要修改:
def home(request): # ModelTranslation会自动根据当前请求的语言,返回对应翻译的title、text字段值 all_posts = Post.objects.all() return render(request, 'home.html', {'all_posts': all_posts})
访问ex.com/en/时自动读取title_en、text_en的内容,访问ex.com/ar/时自动读取title_ar、text_ar的内容,模板中直接调用{{ post.title }}、{{ post.text }}即可。
情况2:需要过滤仅保留有对应语言翻译的文章
如果需要排除没有对应语言翻译的文章(比如某篇文章未填写阿拉伯语内容,访问阿拉伯语站点时不展示该文章),可以按当前语言动态筛选:
def home(request): current_lang = request.LANGUAGE_CODE # 筛选当前语言下标题不为空的文章,可根据需求调整筛选条件,比如同时校验text字段 all_posts = Post.objects.filter(**{f'title_{current_lang}__isnull': False}).exclude(**{f'title_{current_lang}': ''}) return render(request, 'home.html', {'all_posts': all_posts})
内容的提问来源于stack exchange,提问作者Kamarat AbdelSalam
相关产品推荐
相关产品推荐

