Django:将item.id列为字段attr?

时间:2012-11-09 04:15:47

标签: django modelform templatetag

在我的模板中,我有:

{% 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}},因此会被阻塞。 :(任何建议将不胜感激。提前致谢!

2 个答案:

答案 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)
    }

Hidden in Django's docs:

  

此外,绑定到模型对象的模型表单实例将包含self.instance属性,该属性为模型表单方法提供对该特定模型实例的访问。

答案 1 :(得分:0)

这是错误的做法。您应该使用带前缀的单独表单,甚至更好地使用表单集。