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

Django本地化页面切换语言时模板缓存不更新问题咨询

问题根因

你的模板片段缓存只配置了request.user.id作为唯一可变参数,没有将当前语言纳入缓存key的生成规则,导致不同语言的渲染结果共用同一个缓存key,切换语言后自然会读取到旧语言的缓存内容。

解决方案1(推荐:无需删除缓存,自动按语言隔离)

直接修改detail_post.html中的缓存标签,将当前语言代码加入缓存参数,不同语言会生成独立缓存,不需要额外做缓存删除操作:

{% extends "base.html" %}
{% load i18n %}
{% load cache %}
{% block page_content %}
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>{% trans "Detail blog" %}</title>
    </head>
    <!-- 新增request.LANGUAGE_CODE作为缓存参数 -->
    {% cache 500 post request.user.id request.LANGUAGE_CODE %}
    <!-- 原有缓存内容保持不变 -->
    ...
    {% endcache %}
{% endblock %}

这个方案对现有代码侵入最小,性能损耗可以忽略,是多语言站点缓存的标准实现方式。

解决方案2(切换语言时主动删除缓存)

如果你确实需要在切换语言时删除对应用户的所有缓存,可以重写Django默认的语言切换视图:

  1. 新建自定义语言切换视图:
from django.views.i18n import set_language
from django.core.cache import cache
from django.core.cache.utils import make_template_fragment_key

def custom_set_language(request):
    response = set_language(request)
    # 切换语言成功后删除对应用户的帖子缓存
    if request.method == "POST" and response.status_code in (200, 302):
        if request.user.is_authenticated:
            cache_key = make_template_fragment_key('post', [request.user.id])
            cache.delete(cache_key)
    return response
  1. 修改urls.py中的语言切换路由,指向你自定义的视图:
path('set-language/', custom_set_language, name='set_language'),

补充说明

你现有models.py里的post_save信号仅会在帖子内容更新时触发缓存删除,覆盖不到语言切换的场景,所以不会对当前问题生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 12:36:05