如何使用 django 动态访问会话中的值?

Posted

技术标签:

【中文标题】如何使用 django 动态访问会话中的值?【英文标题】:how do i access the values in a session dynamically using 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 %

提前谢谢你!

【问题讨论】:

【参考方案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

以上是关于如何使用 django 动态访问会话中的值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React 中访问 Django 会话

如何在Django中访问子模板中的会话变量?

使用 Django,如何在模板中动态设置 ModelForm 字段值?

如何在单独的表单页面上存储和访问存储在会话对象中的值

如何将会话变量连接到 Django 中的登录用户?

如何访问 Django 模板中的动态键? [复制]