如何使用 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_harkon
、request.session.book_of_narnia
等模板中进行迭代,其中book_of_narnia
等实际上来自book.title
这在 django 模板中很难做到,而且几乎总是需要自定义模板标签
正确,codyc4321 所说的……完全一样。谢谢 codyc4321以上是关于如何使用 django 动态访问会话中的值?的主要内容,如果未能解决你的问题,请参考以下文章