【问题标题】:Django: accessing session variables from within a template?Django:从模板中访问会话变量?
【发布时间】:2011-02-02 20:41:06
【问题描述】:

如果我在 Django 中设置会话变量,例如:

request.session["name"] = "name"

有没有一种方法可以从模板中访问它,或者我必须从视图中检索它,然后将其传递给模板?

因为我有大约 10 个我想在模板中访问的小会话变量而询问,并且将所有 10 个从视图传递到模板可能会有点混乱。

(我必须使用会话变量,因为它是一个 HttpResponseRedirect,但是出于我的目的将变量存储在数据库中是多余的。)

那么 - 有什么方法可以直接在模板中获取会话变量?

【问题讨论】:

    标签: django


    【解决方案1】:

    您需要将django.template.context_processors.request 添加到您的template context processors。然后你可以像这样访问它们:

    {{ request.session.name }}
    

    如果您使用自定义视图,请确保您传递的是 RequestContext 实例。示例取自documentation

    from django.shortcuts import render_to_response
    from django.template import RequestContext
    
    def some_view(request):
        # ...
        return render_to_response('my_template.html',
                                  my_data_dictionary,
                                  context_instance=RequestContext(request))
    

    2013 年更新:从我仍然收到的对此答案的支持来看,人们仍然觉得它很有帮助,在最初编写三年多之后。但是请注意,尽管上面的视图代码仍然有效,但现在有一种更简单的方法可以做到这一点。 render() 是一个与render_to_response() 非常相似的函数,但它自动使用RequestContext,无需显式传递:

    from django.shortcuts import render
    
    def some_view(request):
        # ...
        return render(request, 'my_template.html', my_data_dictionary)
    

    【讨论】:

    • 请参阅stackoverflow.com/questions/2246725/…,了解如何在不覆盖默认值的情况下将 django.core.context_processors.request 添加到模板上下文处理器。
    • 如果我使用 HttpResponse 而不是渲染,我仍然能够在我的模板中获取会话属性。我很困惑,请告诉我
    • @cafebabe1991 你什么意思? HttpResponse 类根本不处理模板,所以这个问题似乎不相关......
    • 是的,实际上我在最后做了一个实验来实现这一点。不好的问题。对不起
    【解决方案2】:

    {{ request.session.name_of_session_key }}

    【讨论】:

      【解决方案3】:

      **

      此答案适用于使用 Django 3.0 及更高版本的用户

      **

      您不需要从视图中传递会话变量,因为会话存储在数据库的 django_sessions 表中。所以只需使用return redirect('/')来模拟无错误传递。

      在 index.html 文件中:

      • 如果会话变量中只有单个数据,请使用

        {{ request.session.your_session_varaible_name }}

      • 如果会话变量中有多个数据,比如列表,可以通过

      {% if 'cart_prod' in request.session %} {% for cart_products in request.session.cart_prod %}
      <tr>
        <td style="padding: 25px">
          {{ cart_products }}
        </td>
        <tr>
          {% endfor %} {% endif %}

      【讨论】:

        【解决方案4】:

        最简单的实现是使用 if 循环:

        {% if 'data' in request.session %}
        

        【讨论】:

        • 这是一个很好的答案!它使您免于日志文件中的任何冗余行。
        【解决方案5】:

        request.session 和其他字典一样,因此您只需对属性和成员使用正常的模板机制:

        {{ request.session.name }}
        

        不要忘记将请求传递到模板上下文中,或者更好地确保您使用的是 RequestContext 并启用了请求上下文处理器。见the documentation

        【讨论】:

          【解决方案6】:

          我正在使用 Django 1.9(2016 年 3 月)并让 {{ request.session.name}} 工作,我的设置是这样的::

          TEMPLATES = [
          {
              'BACKEND': 'django.template.backends.django.DjangoTemplates',
              'DIRS': [],
              'APP_DIRS': True,
              'OPTIONS': {
                  'context_processors': [
                      'django.template.context_processors.debug',
                      'django.template.context_processors.request',
                      'django.contrib.auth.context_processors.auth',
                      'django.contrib.messages.context_processors.messages',
                      ],
                  },
              },
          ]
          

          与前面的答案不同的是:'django.core.context_processors.request'变成了'django.template.context_processors.request'

          【讨论】:

          • 在 Django 1.10 中,django.template.context_processors.request 已经在设置文件中:D
          【解决方案7】:

          现在可能有点晚了。如果您直接在settings.py 中设置TEMPLATE_CONTEXT_PROCESSORS,您将失去所有默认的TEMPLATE_CONTEXT_PROCESSORS 值。这是我在settings.py 中所做的:

          from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as DEFAULT_TEMPLATE_CONTEXT_PROCESSORS
          
          TEMPLATE_CONTEXT_PROCESSORS = DEFAULT_TEMPLATE_CONTEXT_PROCESSORS + (
              'django.core.context_processors.request',
          )
          

          【讨论】:

            【解决方案8】:

            继续@Ludwik Trammer 回答,如何添加 TEMPLATE_CONTEXT_PROCESSORS

            对于 django 1.6,在 settings.py 添加 TEMPLATE_CONTEXT_PROCESSORS 引用以下代码,然后在模板文件中使用{{ request.session.name }}

            TEMPLATE_CONTEXT_PROCESSORS = ("django.contrib.auth.context_processors.auth",
            "django.core.context_processors.debug",
            "django.core.context_processors.i18n",
            "django.core.context_processors.media",
            "django.core.context_processors.static",
            "django.core.context_processors.tz",
            "django.contrib.messages.context_processors.messages",
            "django.core.context_processors.request")
            

            参考https://docs.djangoproject.com/en/1.6/ref/settings/#std:setting-TEMPLATE_CONTEXT_PROCESSORS

            请注意,您应该在设置中使用完整的代码。单独使用"django.core.context_processors.request" 将导致覆盖默认设置。

            【讨论】:

              【解决方案9】:

              先打印request.session.keys() 然后

              request.session['_auth_user_id']
              request.session['_auth_user_backend']
              

              你会得到这两个会话变量。

              【讨论】:

                【解决方案10】:

                在你的 settins.py 中

                TEMPLATE_CONTEXT_PROCESSORS = (
                    'django.core.context_processors.request',
                )
                

                你的观点,可能是这样的。

                from django.shortcuts import render_to_response, render
                from django.http import HttpResponse, HttpResponseRedirect
                from django.template import RequestContext
                
                @login_required()
                def index_admin(request):
                    return render_to_response('carteras/index_admin.html', {}, context_instance=RequestContext(request))
                

                【讨论】:

                • 我还必须将 'django.contrib.auth.context_processors.auth' 添加到 TEMPLATE_CONTEXT_PROCESSORS 元组中。
                【解决方案11】:

                您可以将request 变量传递给模板并在那里使用:

                {{ request.session.name }}
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2019-01-01
                  • 1970-01-01
                  • 2017-02-12
                  • 1970-01-01
                  • 2012-08-26
                  • 2011-04-22
                  • 2014-06-10
                  相关资源
                  最近更新 更多