Django template keyword `choice_value` no longer works in 1.11

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/

+5
source share
1 answer

Like @L_S comments. I am debugging with dir(form) , all the value contained in form.project.data , here is the correct code:

 {% for choice in form.project %} <labelc for="{{ choice.id_for_label }}"> <input type="checkbox" name="{{ choice.data.name }}" id="{{ choice.id_for_label }}" value="{{ choice.data.value }}"{% if choice.data.selected %} checked{% endif %}> {{ choice.data.label }} </label> {% endfor %} 
+5
source

Source: https://habr.com/ru/post/1267265/


All Articles