如何在Django模板中循环渲染HTML代码块?解决语法错误
嘿,我来帮你搞定这个Django模板循环的问题!首先得说,你用PHP的while思路来写Django模板肯定会踩坑——因为Django模板语法和PHP完全不一样,它没有while循环,也不允许直接在模板里修改变量值。
为什么你的代码会报错?
你遇到的'with' expected at least one variable assignment语法错误,本质原因有两个:
- Django模板不支持while循环,它只提供for循环来遍历可迭代对象;
- 即使你用
{% with count = 0 %}成功定义了变量,也没法在模板里执行count +=1——Django模板是沙箱环境,只能读取上下文变量,不能直接修改或赋值。
正确的实现方式
下面给你两种实用的方案,按需选择:
方法1:从视图传递循环范围(推荐,符合Django设计理念)
Django鼓励把逻辑放在视图层,模板只负责渲染。如果循环次数是固定或动态的,最好在视图里把可迭代对象传给模板:
# 你的视图函数(比如views.py里的代码) def rating_view(request): # 其他业务逻辑... # 传递一个包含5次循环的range对象 context = {'loop_times': range(5)} return render(request, 'stories/rating_page.html', context)
然后在模板里用for循环遍历这个range:
{% extends 'stories/base.html' %} {% block body %} <h1>This is rating page</h1> <section class='rating-widget'> {% for _ in loop_times %} <div class='rating-stars text-center'> <ul class='stars'> <li class='star selected' title='Poor' data-value='1'> <i class='fa fa-star fa-fw'></i> </li> <li class='star selected' title='Fair' data-value='2'> <i class='fa fa-star fa-fw'></i> </li> <li class='star selected' title='Good' data-value='3'> <i class='fa fa-star fa-fw'></i> </li> <li class='star selected' title='Excellent' data-value='4'> <i class='fa fa-star fa-fw'></i> </li> <li class='star selected' title='WOW!!!' data-value='5'> <i class='fa fa-star fa-fw'></i> </li> </ul> </div> {% endfor %} </section>
方法2:直接在模板里用字符串迭代(无需修改视图)
如果不想改动视图,也可以用一个长度为5的字符串来做迭代(字符串是可迭代对象,每个字符对应一次循环):
{% extends 'stories/base.html' %} {% block body %} <h1>This is rating page</h1> <section class='rating-widget'> {% for _ in "aaaaa" %} {# 5个a,对应5次循环 #} <div class='rating-stars text-center'> <ul class='stars'> <li class='star selected' title='Poor' data-value='1'> <i class='fa fa-star fa-fw'></i> </li> <li class='star selected' title='Fair' data-value='2'> <i class='fa fa-star fa-fw'></i> </li> <li class='star selected' title='Good' data-value='3'> <i class='fa fa-star fa-fw'></i> </li> <li class='star selected' title='Excellent' data-value='4'> <i class='fa fa-star fa-fw'></i> </li> <li class='star selected' title='WOW!!!' data-value='5'> <i class='fa fa-star fa-fw'></i> </li> </ul> </div> {% endfor %} </section>
这里用_作为循环变量是因为我们不需要用到它的值,只是需要重复5次渲染HTML块。
小提醒
如果循环次数是动态的(比如从数据库读取、用户配置),一定要用第一种方法从视图传递参数;如果是固定次数,两种方法都可以,但第一种更符合Django的“逻辑与渲染分离”的设计原则。
内容的提问来源于stack exchange,提问作者Chandimal Harischandra
相关产品推荐
相关产品推荐

