如何在Django中的另一个应用程序中将Python变量传递给模板

时间:2018-06-27 08:51:42

标签: django django-views

我在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>

任何人都可以帮助解决此问题。谢谢

1 个答案:

答案 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:很抱歉,如果这看起来有点让人光顾,请不要将其视为人身冒犯,我真的是想为您提供这些意见。

现在需要正确的答案:

对于一般情况,当您要使不同无关模板可以访问的数据(对象,列表,字典等)时,主要有两种解决方案:

  1. 一个context processor
  2. 一个custom templatetag

将为所有模板渲染调用上下文处理器(嗯,差不多,比照文档),因此,当您希望“数据”在“开箱即用”的任何地方都可用时,这是正确的解决方案。不利的一面是,每个模板都会对性能造成影响。另外,上下文处理器只能访问请求-它不能访问模板的上下文。

自定义模板标签仅在从模板调用时才执行,因此如果要构建的“数据”成本很高并且仅在少数模板中使用,则这是一个更好的选择。它还可以从模板中获取参数,包括整个上下文。

从可维护性/可重用性的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> 

这当然是一个愚蠢的示例(它可能包含几个错误,因为所有示例都是伪造的),您的真实代码肯定会涉及更多,但这至少应该使您入门。