Javascript 通过jQuery将会话传递给Django模板

Javascript 通过jQuery将会话传递给Django模板,javascript,jquery,ajax,django,cookies,Javascript,Jquery,Ajax,Django,Cookies,我正在尝试$.load()一个Django模板,它使用{%if user.is\u authenticated%}。不幸的是,user对象只有在响应AJAX生成的HTTP请求时才在服务器上呈现时在模板中未定义 my_template.html: {% if user.is_authenticated %} <div>This should be printed</div> {% else %} <div>But this is because ther

我正在尝试
$.load()
一个Django模板,它使用
{%if user.is\u authenticated%}
。不幸的是,
user
对象只有在响应AJAX生成的HTTP请求时才在服务器上呈现时在模板中未定义

my_template.html:

{% if user.is_authenticated %}
  <div>This should be printed</div>
{% else %}
  <div>But this is because there is no user object</div>
{% endif %}
Some stuff
{% my_template_tag %}
据我所知,问题在于,my_loader.html呈现中可用的“上下文”无法通过
.load()
提供给服务器。我不知道这个“上下文”是会话、cookie还是标头中的某个内容,但结果是,当服务器根据通过AJAX生成的HTTP请求呈现my_template.html时,没有
用户
对象。当我在浏览器中有机地加载它时,它工作得很好

如果有帮助:

  • 这是在同一个域上
  • 我已经尝试将.ajax()用于
    xhrFields:{withCredentials:true}
  • 我已经尝试将.ajax()与
    头一起使用:{'sessionid':$.cookie('sessionid')}
    。sessionid cookie不存在(尽管csrftoken存在,所以我知道我找对了地方)

当服务器通过AJAX加载像my_template.html这样的页面时,您知道如何使my_loader.html中的
用户
对象对服务器可用吗?

我假设您希望在Javascript端对
{%if user.is_authenticated%}
进行评估?嗯,这不是怎么回事。Javascript不知道服务器端有什么,也不知道如何解析、计算或绑定用户模板变量

为了
$('#template')。加载('/my_template.html')
要工作,您必须确保在返回
my_template.html
之前,Django会呈现
my_template.html

只需创建一个视图(在Django中)来呈现
my_template.html
。不要担心会话-它应该可以工作,因为随着ajax请求,Cookie(识别会话)也会被发送,这样Django就可以选择正确的会话,并从中提取用户对象。

我假设您希望在Javascript端评估
{%if user.is_authenticated%}
?嗯,这不是怎么回事。Javascript不知道服务器端有什么,也不知道如何解析、计算或绑定用户模板变量

为了
$('#template')。加载('/my_template.html')
要工作,您必须确保在返回
my_template.html
之前,Django会呈现
my_template.html

只需创建一个视图(在Django中)来呈现
my_template.html
。不要担心会话-它应该可以工作,因为随着ajax请求,cookies(识别会话)也会被发送,因此Django可以选择正确的会话,然后从中提取用户对象。

所以我感觉很糟糕,因为我的示例代码实际上没有什么问题——在我尝试将复杂的实际代码提取到抽象级别以呈现给大家的过程中,我无意中遗漏了一个复杂性,这是我的问题的根本原因

事实证明,WTK和我最初的直觉是,默认情况下,cookie将在
.load()
请求中传递,事实上是正确的(检查HTTP请求确认)

所以真正的问题是,实际上,我没有一个模板,而是两个嵌套的模板,后者实际上是一个模板标记。所以真正的结构更像是:

my_template.html:

{% if user.is_authenticated %}
  <div>This should be printed</div>
{% else %}
  <div>But this is because there is no user object</div>
{% endif %}
Some stuff
{% my_template_tag %}
my_template_tag.html:

{% if user.is_authenticated %}
  <div>This should be printed</div>
{% else %}
  <div>But this is because there is no user object</div>
{% endif %}
。。。其中views.py和my_loader.html与上述内容相同。回想起来,我应该注意到
my_template_tag()
没有使用
request
param,这意味着它不会在RequestContext中使
user
可用。基本上:模板标记不像模板那样在上下文中隐式地包含
请求
,而且由于
用户
只是来自
请求。用户
也不可用

对于稍后阅读本文的读者,有两种解决方案:

  • 手动将
    用户
    对象作为参数传递给模板标签
  • 如果可能的话,将
    {%include%}
    with
    关键字一起使用,因为默认情况下它会传递请求

  • 尽管如此,还是要感谢你在这方面的帮助!如果你们不强迫我回去质疑我最初的假设,我不可能找出真正的问题

    所以我感觉很糟糕,因为我的示例代码实际上没有什么问题——在我尝试将复杂的实际代码提取到抽象级别以向大家展示它的过程中,我无意中遗漏了一个复杂性,这是我问题的根本原因

    事实证明,WTK和我最初的直觉是,默认情况下,cookie将在
    .load()
    请求中传递,事实上是正确的(检查HTTP请求确认)

    所以真正的问题是,实际上,我没有一个模板,而是两个嵌套的模板,后者实际上是一个模板标记。所以真正的结构更像是:

    my_template.html:

    {% if user.is_authenticated %}
      <div>This should be printed</div>
    {% else %}
      <div>But this is because there is no user object</div>
    {% endif %}
    
    Some stuff
    {% my_template_tag %}
    
    my_template_tag.html:

    {% if user.is_authenticated %}
      <div>This should be printed</div>
    {% else %}
      <div>But this is because there is no user object</div>
    {% endif %}
    
    。。。其中views.py和my_loader.html与上述内容相同。回想起来,我应该注意到
    my_template_tag()
    没有使用
    request
    param,这意味着它不会在RequestContext中使
    user
    可用。基本上:模板标记不像模板那样在上下文中隐式地包含
    请求
    ,而且由于
    用户
    只是来自
    请求。用户
    也不可用

    对于稍后阅读本文的读者,有两种解决方案:

  • 手动将
    用户
    对象作为参数传递给模板标签
  • 如果可能的话,将
    {%include%}
    with
    关键字一起使用,因为默认情况下它会传递请求
  • 尽管如此,还是要感谢你在这方面的帮助!我不可能找出真正的问题