(Django,Python)我创建了一个book对象列表,它在我的views.py中作为上下文与当前会话一起传递。在我的模板上,我要检查该列表中的书籍是否存储在会话中,如果他们是我想在该会话中访问与该书有关的一些信息。如何动态访问会话中的书籍?有办法吗?
我知道我可以使用" request.session.name"来访问它们。 (其中" name"与存储会话中的空间相同)
会话中保存了多个书名,保存方式如下(在views.py下的函数中)
request.session ["随机书名"] ="随机美元价格" 我想访问"随机美元价格"动态地在模板中。
这是模板中的代码块
{% for book in book_list %}
{% if book.title in request.session %}
{{ request.session.??? }}
{% endif %}
{% endfor %}
提前谢谢!
答案 0 :(得分:1)
您可以将会话数据放入字典中,并在想要在视图函数中呈现时将此数据发送到目标模板。
def some_function(request):
context={
'data':sessionData #put session data here
}
return render(request,"pass/to/template.html",context)
现在您可以访问template.html中的“数据”
答案 1 :(得分:0)
您可以按照此处的属性设置自定义模板标记 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
和docs:
https://docs.djangoproject.com/en/1.11/howto/custom-template-tags/
从我记得的django日起,我应该工作
答案 2 :(得分:0)
我认为您应该只从视图中发送书名列表,而不要发送查询集,因此在与会话进行交叉核对时,可以直接使用书名。
{% for book in book_list %}
{% if book in request.session %}
{{ request.session.book }}
{% endif %}
{% endfor %}