Html CSRF错误django 1.8 i18n国际化

Html CSRF错误django 1.8 i18n国际化,html,django,django-csrf,django-i18n,Html,Django,Django Csrf,Django I18n,嗨,我有django国际化在我的django网站上工作。也就是说,如果我浏览…/en/foo/bar和…/nb/foo/bar,它们工作得很好。但我试图得到一个下拉菜单,自动改变语言,但我得到csrf错误 base.html <form action="{% url 'set_language' %}" method="post"> {% csrf_token %} <input name="next" type="hidden" value="{{ redire

嗨,我有django国际化在我的django网站上工作。也就是说,如果我浏览…/en/foo/bar和…/nb/foo/bar,它们工作得很好。但我试图得到一个下拉菜单,自动改变语言,但我得到csrf错误

base.html

<form action="{% url 'set_language' %}" method="post">
   {% csrf_token %}
    <input name="next" type="hidden" value="{{ redirect_to }}"/>
    <select name="language">
     {% 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>
      <input type="submit" value="Go"/>
 </form>
虽然CSRF验证错误已得到解决,但当我更改语言并提交时,表单无效。它只是停留在同一页上。似乎如果不安全,那么host=request.get\u host始终为true。我不确定我现在做错了什么


我刚刚意识到我的表单向视图发送了一个GET请求,而不是post so请求。方法是GET如何以及为什么会这样?在本例中,表单数据根本不会到达视图,但当我将表单的action属性保留为空时,它们会提交。表单提交给调用该页面的视图。提交到特定视图不起作用,因为请求以某种方式变成了get请求,第一个问题是csrf错误,如果您希望csrf工作,没有简单的解决方案,不能绕过,因为我们无法告诉这里发生了什么-可能是一些与cookie相关的问题

但第二个问题很容易解决。在django有很多。简单地说,django不会在url前面翻译url更改前缀,也不会在用户更改语言时翻译整个url,所以用户将被重定向到具有旧语言前缀的旧的、未翻译的url。这将导致重定向后切换回旧语言

该问题的解决方案已经提交给django,并将在django 1.9中提供,但您可以从github获取该视图的代码,并将其放在当前的语言切换视图中


如果该修复程序已完全提交,则在固定视图中使用的urlresolvers中有一个名为translate_url的新函数。

{%csrf_token%}必须在每个表单上。请确保调用的是您的视图,而不是库中的视图?@itzmeontv是的,我有{%csrf_token%}两方面forms@e4c5是的,我知道,因为在视图中打印内容的代码在我的打印中“我在setlang中,打印”不安全`“不安全”在我提交表单时始终打印,而“下一步”也始终为空无
@csrf_exempt
def set_language(request):
    """
    Redirect to a given url while setting the chosen language in the
    session or cookie. The url and the language code need to be
    specified in the request parameters.

    Since this view changes how the user will see the rest of the site, it must
    only be accessed as a POST request. If called as a GET request, it will
    redirect to the page in the request (the 'next' parameter) without changing
    any state.
    """
    print 'I am in setlang'
    next = request.POST.get('next', request.GET.get('next'))

    if not is_safe_url(url=next, host=request.get_host()):
        print 'not safe'
        next = request.META.get('HTTP_REFERER')
        if not is_safe_url(url=next, host=request.get_host()):
            next = '/'
    response = http.HttpResponseRedirect(next)
    if request.method == 'POST':
        lang_code = request.POST.get('language', None)
        if lang_code and check_for_language(lang_code):
            if hasattr(request, 'session'):
                request.session[LANGUAGE_SESSION_KEY] = lang_code
            else:
                response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang_code,
                                    max_age=settings.LANGUAGE_COOKIE_AGE,
                                    path=settings.LANGUAGE_COOKIE_PATH,
                                    domain=settings.LANGUAGE_COOKIE_DOMAIN)
    return response