Использование JSON в шаблоне Django - PullRequest
6 голосов
/ 09 июня 2011

У меня есть переменная, которая содержит JSON, который мне нужно передать в шаблон. Я определяю его как переменную и затем успешно передаю в шаблон. Однако мне нужен формат для замены кавычек на ", но заменяется на". Это вызывает проблемы со службой, которой я передаю это.

image_upload_params = 
{
  "auth": {
    "key": "xxx"
  },
  "template_id": "xxx",
  "redirect_url": "url-here",
}

Вот как это выглядит в шаблоне:

{'redirect_url': 'url-here', 'template_id': 'xxx', 'auth': {'key': 'xxx'}}

Есть идеи, как заставить его использовать вместо этого?

Ответы [ 4 ]

14 голосов
/ 09 июня 2011

Использование SafeString:

from django.utils.safestring import SafeString

def view(request):
    ...
    return render(request, 'template.html', {'upload_params': SafeString(json_string)})
1 голос
/ 23 августа 2012

Как уже упоминалось в Zeekay, просто используйте встроенную в Python библиотеку json.Он автоматически выведет действительные данные JSON.Вам все равно придется пометить его как «безопасный» для использования django в шаблонах, но вы можете сделать это с помощью «безопасного» фильтра шаблонов.

0 голосов
/ 05 июля 2019

Django 2.1 добавлен шаблонный шаблон json_script:

Безопасно выводит объект Python в виде JSON, заключенный в тег и готовый к использованиюс JavaScript

Вставьте это в ваш шаблон:

{{ value|json_script:"hello-data" }}

Это отдает:

<script id="hello-data" type="application/json">{"hello": "world"}</script>

Затем вы можете безопасно загрузить этот объект в JavaScriptпеременная:

var value = JSON.parse(document.getElementById('hello-data').textContent);

Этот подход безопаснее простого написания var value = {{value|safe}};, потому что он защищает вас от XSS-атак (подробнее в этот билет ).

0 голосов
/ 26 июля 2017

Я нашел метод, который использует фильтр пользовательских шаблонов django.

Код фильтра выглядит следующим образом

custom_filter.py

from django.template import Library
from django.utils.safestring import SafeString
import json

register = Library()


@register.filter("escapedict")
def escapedict(data):
    if not isinstance(data, dict):
        return data
    for key in data:
        if isinstance(data[key], int) and not isinstance(data[key], bool):
            data[key] = int(SafeString(data[key]))
        else:
            data[key] = SafeString(data[key])
    return json.dumps(data)

документ Django

И в шаблоне мы используем фильтр следующим образом:

...
{% load custom_filter %}
some html
...
onclick="jsfunc('{{data|escapedict}}')" 
...
some html
...
...
function showdetails(data){
    parse data here
}
...
...
...