我在app_1中有views
,该字典返回一个字典,我想在另一个名为app_2
的应用程序的html中传递它。我尝试使用{{dic_name.value_1}}
并且也喜欢{{app_name:dic_name.value_1}}
,但是没有用。
-app_1
--urls.py
--views.py
-app_2
--templates
--app_2
-- app_2.html
我在app_1中的视图
def index(request):
user_info={}
user_info['name']= 'joe'
user_info['age'] = 23
return JsonResponse(user_info)
我在app2中的HTML就像
<body>
<h1>Name</h1>: {{user_info.name}}
<h1>Ange</h1>: {{user_info.age}}
</body>
任何人都可以帮助解决此问题。谢谢
答案 0 :(得分:1)
首先有几点评论:
我在app_1中有视图,该视图返回了一个字典
不是,它返回一个HTTP响应(以json内容和application / json作为内容类型)。
,我想在另一个名为app_2的应用程序的html中传递它。
那不是它的工作原理。 Django视图返回一个HTTP响应,即句点(响应的主体是否包含HTML,以及此HTML是否已使用模板构建,在此完全不相关)。
我尝试使用{{dic_name.value_1}},也喜欢使用{{app_name:dic_name.value_1}},但没有用。
意外编程永远无法真正起作用。通过了解事物的工作原理并从一开始就正确地做正确的事情,您将获得更好的结果-并且可以更快地获得它们。
NB:很抱歉,如果这看起来有点让人光顾,请不要将其视为人身冒犯,我真的是想为您提供这些意见。
现在需要正确的答案:
对于一般情况,当您要使不同无关模板可以访问的数据(对象,列表,字典等)时,主要有两种解决方案:
将为所有模板渲染调用上下文处理器(嗯,差不多,比照文档),因此,当您希望“数据”在“开箱即用”的任何地方都可用时,这是正确的解决方案。不利的一面是,每个模板都会对性能造成影响。另外,上下文处理器只能访问请求-它不能访问模板的上下文。
自定义模板标签仅在从模板调用时才执行,因此如果要构建的“数据”成本很高并且仅在少数模板中使用,则这是一个更好的选择。它还可以从模板中获取参数,包括整个上下文。
从可维护性/可重用性的POV中,无论您要使用处理器还是模板标签,通常最好将产生所需值的代码分解成专用的实用程序函数,然后从处理器或标签中调用该函数。
在您的情况下,您的app_1.views.index_view
返回一个JsonResponse,因此将这部分代码分解为确实是最好的解决方案:
app_1 / utils.py:
def get_user_info():
return {"name": "Joe", "age": 42}
app_1 / views.py:
from app_1.utils import get_user_info
def index(request):
user_info = get_user_info()
return JsonResponse(user_info)
app_1 / templatags / app_1.py:
# you'll need this if using python 2.7.x
# else the import will fail
from __future__ import absolute_imports
from django import template
from app_1.utils import get_user_info
register = template.Library()
@register.simple_tag
def user_info():
return get_user_info()
app2 template.html
{% load user_info from app_1 %}
{% user_info as ui %}
<dl>
<dt>Name</dt><dd>{{ ui.name }}</dd>
<dt>Age</dt><dd>{{ ui.age }}</dd>
</dl>
这当然是一个愚蠢的示例(它可能包含几个错误,因为所有示例都是伪造的),您的真实代码肯定会涉及更多,但这至少应该使您入门。