Django чекбокс вопрос - PullRequest
       16

Django чекбокс вопрос

1 голос
/ 31 января 2011

Здравствуйте, у меня есть шаблон формы, который отображает список элементов. Этот шаблон называется edit_order.html. Я хочу иметь возможность добавить новый элемент из другого списка элементов. Из другого списка элементов есть шаблон items.html, показывающий список элементов. В items.html у каждого элемента есть флажок, кроме элемента. Теперь я хочу установить флажок, только если элемент уже указан в шаблоне edit_order. Прямо сейчас все предметы помечены. но я не хочу этого.

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

item.html

 {% 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>

1 Ответ

3 голосов
/ 31 января 2011

Я немного сбит с толку относительно того, что вы пытаетесь сделать.Тем не менее, я бы порекомендовал, если это возможно, использовать библиотеку форм, включенную в 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, данный конструктору формы, имеет ключ для поля «items», которое должно бытьитерируемый из идентификаторов элементов, которые будут проверяться по умолчанию.Вы можете видеть, что 'item-2' задан как начальное значение для поля 'items', а в полученном HTML-отображении проверяется 'item-2'.Таким образом, настраивая этот «начальный» аргумент, вы можете указать, какие из элементов первоначально проверяются на вашей странице.

Если вы используете формы Django, вы также можете легко проверить отправленные данные формы.Вам не нужно указывать форму 'initial' при привязке ее к входным данным, так как не имеет значения, какие элементы были / изначально выбраны.

# 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 после создания формы.

...