首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >让django呈现通过上下文参数传递的python生成的html?

让django呈现通过上下文参数传递的python生成的html?
EN

Stack Overflow用户
提问于 2015-08-13 12:08:40
回答 2查看 692关注 0票数 0

我希望获取一个数据列表,并构建一个包含该数据的< div>元素的正方形(或接近正方形)块,以便使用django在html页面中呈现。

我编写了一些代码,构建了一个方形(ish)元素块,并根据作为列表提供的一些输入对它们进行随机着色。

代码语言:javascript
运行
复制
from math import sqrt, pow
import random

colour_index = {
    1 : 'bg-color-primary-0',
    2 : 'bg-color-primary-1',
    3 : 'bg-color-primary-2',
    4 : 'bg-color-primary-3',
    5 : 'bg-color-primary-4',
    6 : 'bg-color-secondary-0',    
    7 : 'bg-color-secondary-1',
    8 : 'bg-color-secondary-2',
    9 : 'bg-color-secondary-3',
    10 : 'bg-color-tertiary-4',
    11 : 'bg-color-tertiary-0',
    12 : 'bg-color-tertiary-1',
    13 : 'bg-color-tertiary-2',
    14 : 'bg-color-tertiary-3',
    15 : 'bg-color-tertiary-4'
}

width_class = {
    1 : 'width100pc',
    2 : 'width50pc',
    3 : 'width33pc',
    4 : 'width25pc',
    5 : 'width20pc',    
    6 : 'width16pc',
    7 : 'width14pc',
    8 : 'width12pc',
    9 : 'width11pc',
    10: 'width10pc'
}

def nextSQR(anumber):
    if (sqrt(anumber))==int(sqrt(anumber)):
        return pow(int(sqrt(anumber)),2)
    else:
        return pow(int(sqrt(anumber)+1),2)

def targetshape(anumber):
    return (sqrt(nextSQR(anumber)),sqrt(nextSQR(anumber)))

def divgrid(content_list):
    dstring = ""
    targ_shape = targetshape(len(content_list))
    w = targ_shape[0]
    for a in content_list:
        r = random.randrange(1,10)
        dstring = dstring + "<div class=\"" + colour_index.get(r) + " " + width_class.get(w) + "\">" + a + "</div>"
    return dstring

在我的views.py页面中,我将数据库中的元素输入到列表中,通过divgrid()发送列表,并将结果传递到上下文中:

代码语言:javascript
运行
复制
def home(request):
    stuff_list = testContent.objects.all()
    l = [a.name for a in stuff_list]
    mgl = mg.divgrid(l)
    context = {'grid' : mgl}
    return render(request, "test.html", context)

这反过来通过双方括号变量表示法{ grid }提供html页面的生成。

所有这些都很好--除了看到所有的结果都在它们的组织div块中很好地格式化之外,我看到在我的页面上逐字显示的html文本如下:

代码语言:javascript
运行
复制
<div class="bg-color-primary-3 width33pc">Tom Kimber</div><div class="bg-color-secondary-0 width33pc">Tom</div><div class="bg-color-secondary-1 width33pc">Tom</div><div class="bg-color-primary-1 width33pc">Tom</div><div class="bg-color-secondary-3 width33pc">Tom</div><div class="bg-color-primary-1 width33pc">Lisa</div><div class="bg-color-primary-2 width33pc">Bobby Tables</div>

如何让django将生成的html代码解释为代码(即将div呈现为div,从而使元素内容被适当格式化),而不是将其显示为-is?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-13 12:42:38

您可以将divgrid()返回的字符串标记为安全:

代码语言:javascript
运行
复制
from django.utils.safestring import mark_safe

def divgrid(content_list):
    ...
    return mark_safe(dstring)

然后,您可以将上下文变量输出为HTML,而不需要使用|safe过滤器:

代码语言:javascript
运行
复制
{{ grid }}
票数 1
EN

Stack Overflow用户

发布于 2015-08-13 12:13:35

默认情况下,并且出于安全原因,传递给模板的内容被认为不安全并被转义。

因此,<变成了&lt;等;最终的结果是您的HTML被呈现,而不是被解析。

为了防止这种情况,使用 filter将变量标记为“安全的解析”,这样django就不会自动转义它们的内容。

在模板{{ grid|safe }}中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31987828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档