Saltar al contenido

Cómo recorrer las opciones de campo de formulario y mostrar los campos de instancia de modelo asociados

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, CheckboxSelectMultipley 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 %
% csrf_token % % for instance, widget in form.job_applications % endfor %
instance.pk , instance widget

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

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *