There is a multiple flag in the template, if the value contains in the render, the selection will be checked by default. It works well from 1.10.
form.py:
class NewForm(forms.Form): project = forms.ModelMultipleChoiceField( widget=forms.CheckboxSelectMultiple, queryset=Project.objects.filter(enable=True) )
template:
{% for p in form.project %} <label for="{{ p.id_for_label }}"> <input type="checkbox" name="{{ p.name }}" id="{{ p.id_for_label }}" value="{{ p.choice_value }}" {% if p.choice_value|add:"0" in form.project.initial %} checked{% endif %}> <p>{{ p.choice_label }}</p> </label> {% endfor %}
views.py:
def order_start(request, order_id): if request.method == 'POST': form = NewForm(request.POST) if form.is_valid(): order.end_time = timezone.now() order.save() order.project = form.cleaned_data['project'] order.save() return HttpResponsec(order.id) else: form = NewForm(initial={ 'project': [p.pk for p in order.project.all()], }) return render(request, 'orders/start.html', {'form': form, 'order': orderc})
When I upgrade to Django 1.11, {{ p.name }} and {{ p.choice_value }} will return nothing. I know that 1.11 removed choice_value , but how to solve this problem?
1.10 https://docs.djangoproject.com/en/1.10/_modules/django/forms/widgets/
1.11 https://docs.djangoproject.com/en/1.11/_modules/django/forms/widgets/
source share