我有一个包含问题和选择的小测验应用程序。所以我试着把所有这些东西渲染成Django模板。在我的www.example.com中views.py,它看起来像这样
def choice(request):
question_list = get_list_or_404(Question)
page = get_object_or_404(Page, name='about')
letters = ["A", "B", "C", "D", "E"]
return render(request,
'qview/choice.html',
{
'question_list': question_list,
'page': page,
'letters': letters,
}
)
我有一个问题列表和字母列表。所有这些我都作为上下文发送到我的模板。
{% if question_list %}
<ul>
{% for question in question_list %}
<li><a href="#">{{question.question}}</a></li>
<ul>
{% for choice in question.choice_set.all %}
<li>{{ choice.text }}</li>
{% endfor %}
</ul>
{% endfor %}
</ul>
{% else %}
<p>No questions available</p>
{% endif %}
所以在这里我正在通过所有的问题和所有的选择连接到这个问题。但我不知道我怎么也可以通过信件列表?我想压缩它所有。但鉴于我只有问题没有选择,所以我不能压缩到它。
那么还有什么可能呢?
3条答案
按热度按时间k4ymrczo1#
cycle
标签非常适合这种方式。它进入for循环,第一次迭代取第一个参数,第二次迭代取第二个参数,依此类推......如果它们不够,那么它从头开始。mgdq6dx12#
就像A选项01 B选项02等等
这个问题可以通过HTML解决,使用ordered list。
上面将生成一个列表,如
注意字母标签/前缀后面的圆点(
.
),如果认为不合适,可以使用CSS样式去掉圆点。k3fezbri3#
Django模板提供了一些非常方便的循环内置函数,这里你要使用的是
forloop.counter0
,具体来说,就是把它作为letters
列表的索引。custom template tag将有助于使其更具可读性:
在
templatetags/index.py
中创建自定义模板标记:导入django模板顶部的自定义模板标签:
使用模板中的
index
标记访问counter0
循环变量:建议,将它们“压缩”在一起并将压缩后的输出传递给模板可能是一个更好的主意(您已经在考虑这个问题了--很好!)模板应该尽可能少地了解您的业务逻辑,并尽可能少地假设您的数据结构。