在我的模板中,我有:
{% for link in solution_list %}
<form id="marked_solved_form{{link.id}}" action="" method="post">
{{mark_solved_form.is_solution}}
{% csrf_token %}
<label for="id_is_solution{{link.id}}">test form</label>
<input type="hidden" name="next" value="{{ request.path }}"/>
</form>
{% endfor %}
is_solution只是用户可以设置的复选框的布尔字段。
我面临的问题是所有表单都正确填充id,如id =“marked_solved_form3”,{{mark_solved_form.is_solution}}除外。我以为我可以去模型表并编辑属性:
class PostMarkedSolved(ModelForm):
class Meta:
model = MarkedSolved
def __init__(self, *args, **kwargs):
super(PostMarkedSolved, self).__init__(*args, **kwargs)
#self.fields['is_solution'].queryset = Factory.objects.all()
self.fields['is_solution'].widget.attrs={'onchange':'this.form.submit();', 'class':'testing{{link.id}}', 'id':'testing{{link.id}}'}
到目前为止一切顺利。除非加载表单,否则每个列表表单中的每个复选框都会显示以下内容:
<input name="is_solution" type="checkbox" class="testing{{link.id}}" onchange="this.form.submit();" id="testing{{link.id}}">
就好像django忽略了modelform一起转义模板标签{{link.id}}。理想情况下,它会为每个表单实例返回如下内容:
<td>
<form id="marked_solved_form3" action="" method="post">
<input name="is_solution" type="checkbox" class="testing3" onclick="this.form.submit();" id="testing3" />
<div style='display:none'><input type='hidden' name='csrfmiddlewaretoken' value='bwuXYhSpQA8yEOEPSaCt3wAANC0kR7CE' /></div>
<label for="id_is_solution3" onclick="this.form.submit();">test form</label>
<input type="hidden" name="next" value="/task/1"/>
</form>
</td>
<td>
<form id="marked_solved_form4" action="" method="post">
<input name="is_solution" type="checkbox" class="testing4" onclick="this.form.submit();" id="testing4" />
<div style='display:none'><input type='hidden' name='csrfmiddlewaretoken' value='bwuXYhSpQA8yEOEPSaCt3wAANC0kR7CE' /></div>
<label for="id_is_solution4" onclick="this.form.submit();">test form</label>
<input type="hidden" name="next" value="/task/1"/>
</form>
</td>
我甚至安装了django-widget-tweaks(这太棒了,顺便说一下!),并试着这样做:
{{mark_solved_form.is_solution|attr:"id:id_is_solution{{link.id}}"}}
然而,由于无法处理另一个模板标记中的{{link.id}},因此会被阻塞。 :(任何建议将不胜感激。提前致谢!
答案 0 :(得分:1)
模板无法呈现__init__
方法中放置的那些变量。您应该能够通过self.instance
访问模型实例,并通过执行以下操作在__init__
方法中添加正确的ID:
def __init__(self, *args, **kwargs):
super(PostMarkedSolved, self).__init__(*args, **kwargs)
self.fields['is_solution'].widget.attrs={
'onchange':'this.form.submit();',
'class':'testing{0}', 'id':'testing{1}'.format(self.instance.id, self.instance.id)
}
此外,绑定到模型对象的模型表单实例将包含self.instance属性,该属性为模型表单方法提供对该特定模型实例的访问。
答案 1 :(得分:0)
这是错误的做法。您应该使用带前缀的单独表单,甚至更好地使用表单集。