2011-01-31 7 views
1

こんにちは私はアイテムのリストを表示するテンプレートフォームを持っています。このテンプレートはedit_order.htmlと呼ばれます。別のアイテムリストから新しいアイテムを追加できるようにしたい。他のアイテムのリストからはitems.htmlというテンプレートがあり、アイテムのリストが表示されます。 items.htmlでは、各項目には項目の横にチェックボックスがあります。さて、私がしたいのは、アイテムが既にedit_orderテンプレートにリストされている場合にのみ、チェックボックスをマークすることです。現在、すべての商品にはマークが付けられています。私はこれを望んでいません。Djangoのチェックボックスの質問

{% extends "base_menu.html" %} 
    {%block script%} 
    <script type="text/javascript"> 
      $(function(){ 
        $("#check_all").click(function(){ 
          if(this.checked ==true) 
              $("tbody :checkbox").each(function(){ 
                this.checked=true; 
              }); 
            else 
              $("tbody :checkbox").each(function(){ 
                this.checked=false; 
              }); 
        }); 
      }); 
    </script> 
    {%endblock%} 


    <td><a href="{% url tiptop.views.edit_item item.client.pk item.pk %}" onclick="return showAddAnotherPopup(this);">Edit</a></td> 
     </tr> 
{% endfor %} 
</tbody> 
</table></fieldset> 
</div> 
<div id="form_footer"> 
       <input type="submit" value="Request Delivery" onclick="change_action('{% url tiptop.views.service_order client.pk 1 %}')"> 
       <input type="submit" value="Request Pick Up" onclick="change_action('{% url tiptop.views.service_order client.pk 2 %}');validate_status(this.form)"> 
     </div> 


</form> 
{% endblock %} 

     {% block right_content %} 
     <div id="location_header">{{client}}: Search results</div> 
     <form action="{% url tiptop.views.service_order client.pk 1 %}" method="post" onsubmit="return validate_selection(this)"> 
     <div class="form_container"> 
    <fieldset class="model"> 
    <table id="items_table"> 
      <thead> 
      <tr> 
        <th><input type="checkbox" id="check_all" checked="checked"></th> 
        <th scope="col">Tiptop no.</th><th scope="col">Client no.</th><th scope="col">Title</th><th scope="col">Type</th> 
        <th scope="col">Format</th><th scope="col">Status</th><th scope="col">Date</th> 
      </tr> 
      </thead> 
      <tbody> 
    {% for item in items %} 
      <tr class="items_table_row"> 
        <td><input type="checkbox" name="{{item.pk}}" value="{{item.pk}}" checked="checked"></td> 
        <td>{{item.tiptop_id}}</td><td>{{item.alternative_id}}</td><td>{{item.title}}</td><td>{{item.type}}</td><td>{{item.format}}</td> 
        <td><span id="{{item.pk}}" name="type">{{item.itemstatushistory_set.latest}}</span></td><td>{{item.itemstatushistory_set.latest.date.date|date:"d M Y"}}</td> 

答えて

3

item.html edit_order.htmlは

{% for item in items %} 
       <tr> 
       <td><input type="checkbox" name="item" value="{{item.pk}}" checked="checked"></td> 
       <td>{{item.tiptop_id}}</td><td>{{item.alternative_id}}</td><td>{{item.title}}</td> 
       <td>{{item.type}}</td><td>{{item.format}}</td> 

       </tr> 
      {% endfor %} 

私はあなたがしようとしているものに関しては少し混乱しています。しかし、テンプレート内に手作業で複数のフォーム要素をレンダリングするのではなく、Djangoに含まれるフォームライブラリを使用することを可能な限り推奨します。ここでは、カスタム/動的選択がチェックボックスとしてレンダリングされた単純なフォームの例を示します。

>>> class CheckboxForm(forms.Form): 
...  items = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple) 
... 
>>> choices = (('item-1', 'This is item 1'), ('item-2', 'This is item 2'), ('item-3', 'This is item 3')) 
>>> form = CheckboxForm(initial={'items':('item-2',)}) 
>>> form.fields['items'].choices = choices 

>>> print form['items'] 
<ul> 
<li><label for="id_items_0"><input type="checkbox" name="items" value="item-1" id="id_items_0" /> This is item 1</label></li> 
<li><label for="id_items_1"><input checked="checked" type="checkbox" name="items" value="item-2" id="id_items_1" /> This is item 2</label></li> 
<li><label for="id_items_2"><input type="checkbox" name="items" value="item-3" id="id_items_2" /> This is item 3</label></li> 
</ul> 
>>> 

フォームのコンストラクタに与えられた「初期」kwargは、デフォルトでチェックされる要素のIDの反復可能でなければなりません「アイテム」フィールド、のキーを持っていることに注意してください。 'items-2'は 'items'フィールドの 'initial'値として与えられ、結果のHTML表示で 'item-2'がチェックされていることがわかります。したがって、この「初期」引数をカスタマイズすることで、ページの最初にチェックするアイテムを指定することができます。

Djangoフォームを使用する場合は、送信されたフォームデータを簡単に検証することもできます。最初にどの項目が選択されていたかは問題ではないので、データを入力データにバインドするときに「初期」という形式を指定する必要はありません。

# valid submission 
>>> form = CheckboxForm({'items':('item-2',)}) 
>>> form.fields['items'].choices = choices 
>>> print form.is_valid() 
True 
>>> print form.cleaned_data 
{'items': [u'item-2']} 

# invalid submission, 'item-4' does not exist in the field choices 
>>> form = CheckboxForm({'items':('item-4',)}) 
>>> print form.is_valid() 
False 

注:フォームが作成された後にfield.choicesを設定する代わりに、フォームにカスタムコンストラクタを設定し、その中に選択肢を渡すこともできます。

+0

私はdjangoフォームを使用しています。私は私の意見をアップロードしていない。私はすでにチェックリストを持っています。私はアイテムをリストするテンプレートを持っています。このテンプレートからは、アイテムを追加できます。今ではアイテムを追加することを意味するとき、私はフォームを作成することを意味しません。つまり、既存のすべてのクライアントアイテムをリストするページに移動します(このテンプレートがあります)。このテンプレートには、追加する既存のアイテムを選択できるリストがあります。私が問題を抱えているのは、チェックボックスです。彼らは何らかの理由で私のコードの中ですべて「刻まれている」。テンプレート項目リストの項目にチェックを入れ、空白にします。 – Shehzad009