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

Django双语博客开发:如何翻译模型查询返回的文章内容?

解决Django数据库文章内容的多语言翻译问题

嘿,我懂你现在的困惑——{% blocktrans %}确实能帮你处理带变量的静态模板文本翻译,但它可不是用来搞定数据库里动态文章内容的哦!让我给你捋捋正确的解决思路:

最推荐的方案:使用django-modeltranslation库

这是Django生态里处理模型多语言字段最成熟的工具,官方也很推荐,步骤超清晰:

  1. 安装库
    在终端运行:

    pip install django-modeltranslation
    
  2. 配置settings.py
    把modeltranslation加到INSTALLED_APPS里,注意要放在django.contrib.admin前面,不然后台显示会有问题:

    INSTALLED_APPS = [
        'modeltranslation',
        'django.contrib.admin',
        # 其他已有的app...
    ]
    

    同时确保你已经在settings里配置了支持的语言,比如:

    LANGUAGES = [
        ('en', 'English'),
        ('zh-hans', '简体中文'),
    ]
    USE_I18N = True
    
  3. 配置模型的翻译字段
    可以在你的models.py里直接添加翻译配置,或者单独建一个translation.py文件(更规范)。比如你的文章模型是Article:

    from django.db import models
    from modeltranslation.translator import register, TranslationOptions
    
    class Article(models.Model):
        title = models.CharField(max_length=200)
        content = models.TextField()
        # 其他字段比如创建时间、作者之类的...
    
    # 注册翻译配置
    @register(Article)
    class ArticleTranslationOptions(TranslationOptions):
        # 指定需要翻译的字段
        fields = ('title', 'content',)
    
  4. 迁移数据库
    运行以下命令让Django自动生成多语言对应的数据库字段(比如title_en、content_zh-hans):

    python manage.py makemigrations
    python manage.py migrate
    
  5. 后台管理与模板使用

    • 后台会自动生成对应语言的输入框,你可以直接在后台填写不同语言的标题和内容;
    • 模板里不用任何特殊翻译标签,直接调用字段就行,Django会根据当前激活的语言自动加载对应版本:
      <h2>{{ article.title }}</h2>
      <div class="article-content">{{ article.content }}</div>
      

    如果需要手动指定语言(比如做语言切换按钮),也可以直接调用article.title_en、article.content_zh-hans这类字段。

手动实现方案(不依赖第三方库)

如果你不想用第三方库,也可以手动给模型添加多语言字段:

class Article(models.Model):
    title_en = models.CharField(max_length=200, verbose_name="英文标题")
    title_zh = models.CharField(max_length=200, verbose_name="中文标题")
    content_en = models.TextField(verbose_name="英文内容")
    content_zh = models.TextField(verbose_name="中文内容")
    # 其他字段...

然后在模板里根据当前语言判断显示哪个字段:

{% if request.LANGUAGE_CODE == 'en' %}
    <h2>{{ article.title_en }}</h2>
    <div>{{ article.content_en }}</div>
{% else %}
    <h2>{{ article.title_zh }}</h2>
    <div>{{ article.content_zh }}</div>
{% endif %}

不过这种方法比较繁琐,后台管理也要自己配置字段显示,适合简单场景。

为什么{% blocktrans %}没用?

再给你补个知识点:{% blocktrans %}的作用是把模板里的静态文本提取到po/mo翻译文件里,而数据库里的文章内容是动态存储的,不属于模板的静态字符串,所以这个标签根本没法处理这类内容哦~

内容的提问来源于stack exchange,提问作者swordfish

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:26:55