Django: вставьте строковую переменную из Views.py с тегами HTML и шаблона Django в файл HTML.

Итак, это моя проблема: у меня есть строка Python, которая содержит как HTML, так и Теги шаблона Django и хочу внедрить их в базовый HTML-файл, когда я перехожу на эту страницу. Хотя, когда я перехожу на страницу, все HTML отображаются, но теги шаблона Django не отображаются и обрабатываются буквально как строки?

Вот упрощенный пример проблемы:

Views.py

def page(request, code):
    html = { 
        'code': code
        'html': """<p>Hello world {{ code }}</p> <script src="{% static 'appName/javascript_code_example.js' %}"></script>"""
        } 
    return render(request, 'base.html', html)

base.html

{% load static %}
...
{{ html | safe }} 
...

И все, что я увижу, когда запущу приложение на своем локальном компьютере с python3 manage.py runserver и перейду к URL-адресу, отображающему base.html, будет Hello world {{ code }}, а код Javascript не будет выполнен. Вместо {{ code }} я хотел бы видеть фактическое значение ключа 'code' в словаре html в файле Views.py.

Если мой файл base.html выглядит следующим образом:

{% load static %}
...
<p>Hello world {{ code }}</p> 

<script src="{% static 'appName/javascript_code_example.js' %}"></script>
...

Затем будет включен Javascript, и я увижу Hello world value_of_code_variable на экране.


person dir101    schedule 27.12.2019    source источник


Ответы (3)


вам нужно загрузить скрипт Python, который имеет функции библиотеки шаблонов. Кроме того, почему вы визуализируете строку в html, а не создаете шаблон html? (html-файл с синтаксисом шаблона)?

person wil moskal    schedule 27.12.2019
comment
не могли бы вы уточнить, что вам нужно загрузить скрипт Python, который имеет функции библиотеки шаблонов? Не уверен, что вы имеете в виду? В моем фактическом файле HTML есть синтаксис шаблона — я извлекаю строку из таблицы базы данных, которая содержит тело файла шаблона HTML, но также содержит теги шаблона Django. - person dir101; 27.12.2019
comment
В вашем приложении у вас должна быть папка с именем templatetags. В нем вы можете иметь скрипты Python и файл init.py. Допустим, у вас есть файл с именем template_functions.py. Затем в вашем html у вас должна быть строка, похожая на строку {% load static %}. В примере это будет {% load template_functions %}, прежде чем вы сможете использовать функции или классы в этих файлах. - person wil moskal; 27.12.2019
comment
Также в {% load template_functions %} вы должны убедиться, что вы регистрируете свои функции или классы в библиотеке шаблонов. - person wil moskal; 27.12.2019
comment
Я все еще не уверен, что вы имеете в виду? Пожалуйста, смотрите обновление моего вопроса. Если я включу все в значение ключа html <p>Hello world {{ code }}</p> <script src="{% static 'appName/javascript_code_example.js' %}"></script> в фактическом файле base.html, тогда все будет работать так, как ожидалось. Когда я пытаюсь ввести его как строку, он обрабатывает {{ code }} и {% static 'appName/javascript_code_example.js' %} как буквальные строки - в этом проблема. - person dir101; 27.12.2019

Механизм шаблонов Django не будет отображать (анализировать) код шаблона внутри введенных строк. Чтобы это произошло, вы должны вручную отобразить код шаблона одним из следующих способов:

Если вы решите выбрать последний, вам определенно следует рассмотреть возможность использования include тег шаблона в вашем base.html (вместо ручного рендеринга с использованием render_to_string()), так как это уменьшает объем ручной работы и является предпочтительным способом рендеринга кода шаблона внутри другого шаблона.

person Dabble    schedule 28.12.2019

Вы можете использовать запись файла для выполнения этой задачи. Сделайте newfile.html в папке шаблонов, и вы можете сделать это

Views.py

html_tag = "{% extends \"yourapp/base.html\"%}"+"{% block content %}"
html_tag +="<p>Hello world {{ code }}</p> <script src=\"{% static \"appName/javascript_code_example.js\" %}\"></script>"
html_tag +="{% endblock content %}"
html_file = open('yourapp/templates/yourapp/newfile.html', "w")
html_file.write(html_tag)
html_file.close()
html = { 
        'code': code
        }
return render(request, r'yourapp\newfile.html', html)

В base.html

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
<p>Your base code</p>
<!--The part of code you want to retrieve from views.py file-->
{% block content %}{% endblock content %}
</body>
</html>
person Ankit Jain    schedule 12.11.2020
comment
Однако мне также любопытно то, что вы спросили. Этот тип приема html-кода требуется во многих местах. - person Ankit Jain; 12.11.2020