1

私のテンプレートには次のものがあります:

{% 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 は、ユーザーが設定できるチェックボックスの単なるブールフィールドです。

私が直面している問題は、{{mark_solved_form.is_solution}} を除いて、すべてのフォームに id="marked_solved_form3" のような ID が正しく入力されることです。モデルフォームに移動して属性を編集するだけでよいと思いました。

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}}">

モデルフォームがテンプレートタグ {{link.id}} を一緒にエスケープしていることを django が無視しているようです。理想的には、フォーム インスタンスごとに次のようなものを返します。

  <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}} を処理できないため、窒息しました。:(どんな提案でもいただければ幸いです。よろしくお願いします!

4

2 に答える 2

1

__init__テンプレートは、メソッドに配置された変数をレンダリングできません。次の手順を実行することで、モデル インスタンスにアクセスし、メソッドself.instanceに正しい ID を追加できるはずです。__init__

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

Django のドキュメントに隠されています:

また、モデル オブジェクトにバインドされたモデル フォーム インスタンスには、モデル フォーム メソッドがその特定のモデル インスタンスにアクセスできるようにする self.instance 属性が含まれます。

于 2012-11-09T06:06:46.120 に答える