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默认的语言切换视图:
- 新建自定义语言切换视图:
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
- 修改urls.py中的语言切换路由,指向你自定义的视图:
path('set-language/', custom_set_language, name='set_language'),
补充说明
你现有models.py里的post_save信号仅会在帖子内容更新时触发缓存删除,覆盖不到语言切换的场景,所以不会对当前问题生效。
内容的提问来源于stack exchange,提问作者Steep 27
相关产品推荐
相关产品推荐

