Как передать переменную Python в шаблон в другом приложении в Django - PullRequest
0 голосов
/ 27 июня 2018

У меня есть views в app_1, который возвращает словарь, и я хочу передать его в html в другое приложение под названием app_2. Я пытался использовать {{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)

мой HTML в app2 похож на

<body>
 <h1>Name</h1>: {{user_info.name}}
 <h1>Ange</h1>: {{user_info.age}}
</body>

Может кто-нибудь помочь решить эту проблему. Спасибо

1 Ответ

0 голосов
/ 27 июня 2018

Первая пара комментариев:

У меня есть представления в app_1, который возвращает словарь

Нет, он возвращает HTTP-ответ (с содержимым json и application / json в качестве типа содержимого).

и я хочу передать его в html в другое приложение с именем app_2.

Это просто не так, как это работает. Представление Django возвращает HTTP-ответ, точка (здесь, где тело ответа содержит HTML, и если этот HTML-код был построен с использованием шаблона, здесь совершенно не имеет значения).

Я пытался использовать {{dic_name.value_1}}, а также как {{app_name: dic_name.value_1}}, но это не сработало.

Программирование случайно не работает на самом деле. Вы получите лучшие результаты - и получите их быстрее - понимая, как все работает, и поступайте правильно с самого начала.

NB: Извините, если это выглядит немного покровительственно, пожалуйста, не воспринимайте это как личное оскорбление, я действительно пытаюсь помочь вам с этими комментариями.

Теперь для правильного ответа:

В общем случае, когда у вас есть фрагмент данных (объект, список, диктант и т. Д.), Который вы хотите сделать доступным для различных несвязанных шаблонов, у вас в основном есть два решения:

  1. контекстный процессор
  2. a customtatag

Контекстный процессор будет вызываться для всех шаблонов рендеринга (ну, почти, см. Документ), так что это правильное решение, когда вы хотите, чтобы этот «фрагмент данных» был доступен везде «из коробки». Недостатком является то, что вы получите удар по производительности для каждого шаблона. Кроме того, процессор контекста имеет доступ только к запросу - он не может получить доступ к контексту шаблона.

Пользовательский тег шаблона выполняется только при вызове из шаблона, поэтому лучше выбрать вариант, если требуемый фрагмент данных требует больших затрат и используется только в нескольких шаблонах. Также он может принимать аргументы из шаблона, включая полный контекст.

Из 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> 

Это, конечно, дурацкий пример (и он может содержать пару ошибок, как и все выдуманные примеры), и ваш реальный код, безусловно, будет немного более сложным, но это, по крайней мере, должно помочь вам начать.

...