Después de de nuestra larga selección de información dimos con la solución esta duda que suelen tener muchos de nuestros lectores. Te brindamos la solución y esperamos servirte de mucha ayuda.
Solución:
Lo más fácil sería si define todo el formulario en una plantilla HTML. Debería poder iterar sobre los valores de un campo en una plantilla como esa:
% for value, text in form.hikers.field.choices %
value : text
% endfor %
Pruebe esta solución:
% for choice in form.my_choice_field.field.choices %
-
% endfor %
vea este enlace: http://www.ilian.io/django-forms-choicefield-and-custom-html-output/
Esto es sorprendentemente complicado, pero puedes hacerlo usando ModelMultipleChoiceField
, CheckboxSelectMultiple
y un filtro de plantilla personalizado. Las clases de formulario y widget hacen la mayor parte del camino, pero el filtro de plantilla determina qué widget darle para cada instancia en el conjunto de consultas. Vea abajo…
Solución genérica
# forms.py
from django import forms
from .models import MyModel
class MyForm(forms.Form):
my_models = forms.ModelMultipleChoiceField(
widget=forms.CheckboxSelectMultiple,
queryset=None)
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
self.fields['my_models'].queryset = MyModel.objects.all()
# myapp/templatetags/myapp.py
from django import template
from copy import copy
register = template.Library()
@register.filter
def instances_and_widgets(bound_field):
"""Returns a list of two-tuples of instances and widgets, designed to
be used with ModelMultipleChoiceField and CheckboxSelectMultiple widgets.
Allows templates to loop over a multiple checkbox field and display the
related model instance, such as for a table with checkboxes.
Usage:
instances_and_widgets %
instance : widget
% endfor %
"""
instance_widgets = []
index = 0
for instance in bound_field.field.queryset.all():
widget = copy(bound_field[index])
# Hide the choice label so it just renders as a checkbox
widget.choice_label = ''
instance_widgets.append((instance, widget))
index += 1
return instance_widgets
# template.html
% load myapp %
Específico para ti
Debería funcionar si ajustas el formulario así:
class ClubForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
cluk_pk = kwargs.pop('club_pk')
super(ClubForm, self).__init__(*args, **kwargs)
self.fields['hikers'].queryset = Club.objects.filter(pk=club_pk)
class Meta:
model = Club
fields = ('hikers',)
widgets = 'hikers': forms.CheckboxSelectMultiple