【问题标题】:how do i access the values in a session dynamically using django?如何使用 django 动态访问会话中的值?
【发布时间】:2017-12-19 16:56:20
【问题描述】:

(Django , Python) 我创建了一个书籍对象列表,它在我的views.py 中作为上下文与当前会话一起传递。在我的模板上,我要检查该列表中的书籍是否存储在会话中,如果它们是,我想在该会话中访问与该书籍相关的一些信息。如何动态访问会话中的书籍?有什么办法吗?

我知道我可以使用“request.session.name”访问它们(其中“name”与它存储的会话中的空间相同)

session中保存了几个书名,保存方式如下(在views.py下的一个函数中)

request.session["随机书名"] = "随机美元价格" 我想在模板中动态访问“随机美元价格”。

这是模板中的代码块

{% for book in book_list %}
    {% if book.title in request.session %}
          {{ request.session.??? }}                      
    {% endif %}
{% endfor %}

提前谢谢你!

【问题讨论】:

    标签: python html django django-templates


    【解决方案1】:

    我认为您应该只发送视图中的书名列表而不是查询集,因此当您与会话进行交叉检查时,您可以直接使用标题。

    {% for book in book_list %}
        {% if book in request.session %}
            {{ request.session.book }}                      
        {% endif %}
    {% endfor %}
    

    【讨论】:

      【解决方案2】:

      您可以制作自定义模板标签以按属性查找,如下所示 Performing a getattr() style lookup in a django template:

      # app/templatetags/getattribute.py
      
      import re
      from django import template
      from django.conf import settings
      
      numeric_test = re.compile("^\d+$")
      register = template.Library()
      
      def getattribute(value, arg):
          """Gets an attribute of an object dynamically from a string name"""
      
          if hasattr(value, str(arg)):
              return getattr(value, arg)
          elif hasattr(value, 'has_key') and value.has_key(arg):
              return value[arg]
          elif numeric_test.match(str(arg)) and len(value) > int(arg):
              return value[int(arg)]
          else:
              return settings.TEMPLATE_STRING_IF_INVALID
      
      register.filter('getattribute', getattribute)
      

      现在将您的模板更改为

      {% load getattribute %}
      
      {% for book in book_list %}
          {% if book.title in request.session %}
                {{ request.session|getattribute:book.title }}                      
          {% endif %}
      {% endfor %}
      

      这是一个基本的自定义模板标签示例:

      Django - Simple custom template tag example

      和文档:

      https://docs.djangoproject.com/en/1.11/howto/custom-template-tags/

      从我记忆中的 django 时代应该可以工作

      【讨论】:

      • 完美!这似乎更像它......谢谢!我会试一试,然后告诉你
      • 雅 django 模板有限,我现在使用 flask api/reactjs 应用程序 :)
      【解决方案3】:

      您可以将会话数据放在字典中,并在您想在视图函数中呈现时将此数据发送到目标模板。

      def some_function(request):
              context={
                'data':sessionData #put session data here
              }
              return render(request,"pass/to/template.html",context)
      

      现在您可以在 template.html 中访问“数据”

      【讨论】:

      • 这已经在我的函数中完成了,我想做的是在模板中动态访问这些值......我知道我可以通过“request.session.”name”访问这些值,但我不想硬编码我想动态执行的“名称”...有没有办法?
      • 动态是什么意思?你能再解释一下吗?
      • 他需要在request.session.adventures_of_harkonrequest.session.book_of_narnia等模板中进行迭代,其中book_of_narnia等实际上来自book.title
      • 这在 django 模板中很难做到,而且几乎总是需要自定义模板标签
      • 正确,codyc4321 所说的……完全一样。谢谢 codyc4321
      猜你喜欢
      • 2012-08-26
      • 2020-04-18
      • 1970-01-01
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-20
      • 1970-01-01
      相关资源
      最近更新 更多