Django模板循环表单数组时,如何关联模型属性显示编辑标识
解决表单循环时访问对应模型属性的问题
嘿,这个需求完全能实现!其实你不用折腾复杂的方案,有两种简单的方式就能让你在模板里轻松关联每个表单对应的模型对象:
方法一:直接利用ModelForm的instance属性
既然你是在编辑模型,那肯定用的是ModelForm对吧?当你在视图里创建表单时传入了instance参数(比如form = MyModelForm(instance=obj)),表单对象本身就持有这个模型实例的引用——你直接在模板里通过form.instance就能访问对应的模型对象!
修改你的模板代码就行:
{% extends 'app_base.html' %} {% block content %} <p>{{message}}</p> <form method="post">{% csrf_token %} {% for form in forms %} <p><strong>{{ form.instance.name }}:</strong></p> {{ form.as_p }} {% endfor %} <input type="submit" value="Submit" /> </form> {% endblock %}
如果包含新建的表单(没有传入instance),form.instance会是一个空的模型实例,这时候可以加个判断避免显示空内容:
{% for form in forms %} <p> {% if form.instance.pk %} <strong>{{ form.instance.name }}:</strong> {% else %} <strong>新建条目:</strong> {% endif %} </p> {{ form.as_p }} {% endfor %}
方法二:在视图中打包表单与模型对象
如果你更倾向于在视图里明确关联表单和对象,也可以把每个表单和对应的模型对象打包成元组,再传递给模板:
视图代码示例:
# 替换你原来创建表单列表的代码 forms_with_objects = [] for obj in MyModel.objects.all(): form = MyModelForm(instance=obj) forms_with_objects.append( (form, obj) ) # 把这个打包后的列表传入上下文 context['forms_with_objects'] = forms_with_objects
模板代码修改:
{% extends 'app_base.html' %} {% block content %} <p>{{message}}</p> <form method="post">{% csrf_token %} {% for form, obj in forms_with_objects %} <p><strong>{{ obj.name }}:</strong></p> {{ form.as_p }} {% endfor %} <input type="submit" value="Submit" /> </form> {% endblock %}
两种方法都能完美解决你现在的问题,让每个表单都能清晰标识对应的编辑对象~
内容的提问来源于stack exchange,提问作者NickP
相关产品推荐
相关产品推荐

