我想获取一个数据列表,并构建一个正方形(或接近正方形)的块< DIV>包含该数据的元素,用于使用django在html页面中呈现。
我编写了一些构建方形(ish)元素块的代码,并根据作为列表提供的一些输入随机着色。
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()发送列表,并将结果传递给我的上下文:
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文本在我的页面上逐字显示如下:
<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,导致元素内容格式正确)而不是将文本显示为原样?
答案 0 :(得分:2)
默认情况下,出于安全原因,传递给模板的内容被视为不安全并被转义。
因此<
变为<
等;最终结果是您的HTML被呈现而不是被解析。
为了防止这种情况,请使用safe
filter将变量标记为“可以安全解析”,这样django就不会自动转义其内容。
在模板中{{ grid|safe }}
。
答案 1 :(得分:1)
您可以将divgrid()
返回的字符串标记为安全:
from django.utils.safestring import mark_safe
def divgrid(content_list):
...
return mark_safe(dstring)
然后,您可以将上下文变量输出为HTML,而无需|safe
过滤器:
{{ grid }}