You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 13:51:04