在 Django 模板中渲染并行数组

[复制链接]
发表于 2026-2-10 23:52:23 | 显示全部楼层 |阅读模式
在 Django 模板中渲染并行数组通常涉及使用模板语言中的循环布局来遍历和展示数组中的每个元素。假设你有一个名为 items 的数组,你可以按照以下方式在 Django 模板中渲染它:
  1. <ul>
  2.   {% for item in items %}
  3.     <li>{{ item }}</li>
  4.   {% endfor %}
  5. </ul>
复制代码
在这个例子中,items 是一个 Python 列表,它会在模板中被睁开并体现每个元素。每次迭代循环时,变量 item 将代表数组中的一个元素,并通过 {{ item }} 的方式插入到 HTML 中。
如果 items 是一个包罗字典或对象的列表,你可以使用点体现法访问它们的属性。比方,如果 items 是一个包罗对象的列表,每个对象有一个 name 属性,可以如许访问:
  1. <ul>
  2.   {% for item in items %}
  3.     <li>{{ item.name }}</li>
  4.   {% endfor %}
  5. </ul>
复制代码
这种方法使得在 Django 模板中展示和渲染多个数组元素非常方便和机动。
1、题目配景
在使用 Django 渲染模板时,偶然必要同时渲染两个数组的数据,一个数组是必要输出的数据,另一个数组是用于删除项的表单集。由于 Django 不支持在模板标签中使用布尔运算符,直接将这两个数组打包在一起大概会导致只渲染第一个项目和第一个表单。因此,必要一种方法将这些项目打包在一起,以便在同一个 for 循环中渲染它们。
2、办理方案
可以使用 Python 内置的 zip 函数来办理这个题目。zip 函数可以将多个可迭代对象打包成一个元组的列表,此中每个元组包罗这些可迭代对象中相应位置的元素。
在视图中,可以使用以下代码将 post 数组和 delpostformset.forms 数组打包在一起:
  1. post_and_form = zip(post, delpostformset.forms)
复制代码
然后在模板中,可以使用以下代码来渲染打包后的数组:
  1. {% for post, form in post_and_form %}
  2. {% endfor %}
复制代码
如许,就可以在一个 for 循环中渲染这两个数组的数据了。
以下是一个完备的示例代码:
视图
  1. from django.shortcuts import render_to_responsefrom django.template import RequestContextfrom forum.models import forum, UserProfilefrom django.contrib.auth.decorators import login_requiredfrom forum.forms import PostForm, PostDeleteForm, ReadForumFormfrom django.forms.models import modelformset_factory@login_requireddef forums(request ):    post = list(forum.objects.filter(child='0') & forum.objects.filter(deleted='0'))    user = UserProfile.objects.get(pk=request.session['_auth_user_id'])    newpostform = PostForm(request.POST)    deletepostform = PostDeleteForm(request.POST)    DelPostFormSet = modelformset_factory(forum, exclude=('child','postSubject','postBody','postPoster','postDate','childParentId'))    readform = ReadForumForm(request.POST)    if newpostform.is_valid():        topic = request.POST['postSubject']        poster = request.POST['postPoster']        newpostform.save()    newpostform = PostForm(initial = {'postPoster':user.id})    post = list(forum.objects.filter(child='0') & forum.objects.filter(deleted='0'))    else:        newpostform = PostForm(initial = {'postPoster':user.id})    if request.method == 'POST':        delpostformset = DelPostFormSet(request.POST)        if delpostformset.is_valid():            delpostformset.save()    else:        delpostformset = DelPostFormSet(queryset=forum.objects.filter(child='0', deleted='0'))    post_and_form = zip(post, delpostformset.forms)
  2.     return render_to_response('forum.html', {'post': post_and_form, 'newpostform': newpostform, },  context_instance=RequestContext(request))
复制代码
模板
  1. <table class="results">
  2. <tr class="inner_results_header"><td >Title</td><td>Date/Time</td><td>Poster</td>      <td>Body</td><td><form method="post" id="form" action=""  class="usertabs accfrm"><input type="submit" value="Delete" /></td></tr>  
  3. {{formset.management_form}}
  4. {% for post, form in post   %}
  5. {% url forum_view p.postID  as post_url%}
  6. <tr  class="inner_results {% if forloop.counter|divisibleby:2 %}evens{% else %}odds{% endif %}"><span onclick="document.location.href='{{post_url}}';"><td>{{ p.postSubject}}</td><td>{{p.postDate}}</td><td>{{ p.postPoster}}</td><td>{{ p.postBody|truncatewords:50}}</td></span><td>
  7. {{ form.as_p }}
  8. </td></tr>
  9. {% endfor %}
  10. <tr class="inner_results_header"><td >Title</td><td>Date/Time</td><td>Poster</td> <td>Body</td><td><input type="submit" value="Delete" /></form></td></tr>  
复制代码
如许,就可以在 Django 模板中渲染并行数组了。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表