Django1.10 - /i18n/setlang/ CSRF 令牌丢失或不正确

Posted

技术标签:

【中文标题】Django1.10 - /i18n/setlang/ CSRF 令牌丢失或不正确【英文标题】:Django1.10 - /i18n/setlang/ CSRF token missing or incorrect 【发布时间】:2017-06-16 23:43:59 【问题描述】:

在语言切换器表单中选择语言后,出现 CSRF 错误:

表单在 base.html

<form action="% url 'set_language' %" method="post" class="form-inline">
  % csrf_token %
  <input name="next" type="hidden" value="" />
  <div class="form-group">
    <div class="input-group">
      <div class="input-group-addon"><i class="fa fa-globe" aria-hidden="true"></i></div>
      <select name="language" class="form-control" id="lang-switcher">
        % get_current_language as LANGUAGE_CODE %
        % get_available_languages as LANGUAGES %
        % get_language_info_list for LANGUAGES as languages %
        % for language in languages %
          <option value=" language.code "% if language.code == LANGUAGE_CODE % selected="selected"% endif %>
             language.name_local  ( language.code )
          </option>
        % endfor %
      </select>
    </div>
  </div>
</form>

我用JS提交表单:

jQuery('#lang-switcher').change(
    function()
        jQuery(this).closest('form').trigger('submit');
    );

我的模板文件art.html如下:

% extends "base.html" %
% load staticfiles %
% load i18n %

% block content %
  ....
% endblock %

views.py如下:

from django.template import RequestContext
from django.shortcuts import render_to_response

from .models import Exhibition, Picture

def index(req):
  highlight = Exhibition.objects.latest()
  exhibitions = Exhibition.objects.all()[1:]
  return render_to_response('art.html', RequestContext(req,'highlight': highlight, 'exhibitions': exhibitions))

urls.py如下:

urlpatterns = [
  url(r'^i18n/', include('django.conf.urls.i18n')),
  url(r'^admin/', admin.site.urls),
  url(r'^art/', index),
  url(r'^$', views.flatpage, 'url': '/home/', name='home')
]

我可以加载没有问题的页面,然后当我提交表单以切换语言时,我收到 CSRF 错误。

编辑

我必须补充一点,当我在 root 上时,表单运行良好。

【问题讨论】:

清除浏览器缓存解决了我的问题。 【参考方案1】:

我终于通过在我看来使用不同的渲染函数来解决它:

  return render(req, 'art.html', 'highlight': highlight, 'exhibitions': exhibitions)

【讨论】:

感谢您的解决方案!我有同样的问题,非常奇怪的行为。

以上是关于Django1.10 - /i18n/setlang/ CSRF 令牌丢失或不正确的主要内容,如果未能解决你的问题,请参考以下文章

Django1.10官方文档翻译

windows10搭建django1.10.3+Apache2.4

使用Django1.10版本时,配置文件要注意的地方

django1.10使用本地静态文件

django1.10安装

基于Django1.10与Celery4实现异步队列任务