2011-04-21 12 views
12

Soy un novato en Django y realmente apreciaría que me pudieras ofrecer alguna guía. Intento crear un formulario que permita a un usuario marcar una o más opciones. Entendí que debo usar el campo MultipleChoiceField con un widget CheckboxSelectMultiple, pero la documentación de Django no ofrece un ejemplo sobre este tema. Le agradecería que me ofreciera un ejemplo y me explicara cómo manejo los resultados. Por ejemplo, si tengo un formulario con las opciones a b c d, y el usuario marca cyd. Además, ¿cómo especifico las opciones (no quiero usar un db, una lista de cadenas es lo que tengo en mente)? Muchas graciasDjango forma múltiple opción

Respuesta

13

esperanza esto ayuda: D

from django import forms 


    class Test(forms.Form): 
     OPTIONS = (
      ("a", "A"), 
      ("b", "B"), 
      ) 
     name = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple, 
             choices=OPTIONS) 
+0

¿Cómo hago pantalla Django/valores seleccionados cuando ya está guardado editando el formulario? – YoYo

36

forms.py

class SomeForm(forms.Form): 
    CHOICES = (('a','a'), 
       ('b','b'), 
       ('c','c'), 
       ('d','d'),) 
    picked = forms.MultipleChoiceField(choices=CHOICES, widget=forms.CheckboxSelectMultiple()) 

views.py

def some_view(request): 
    if request.method == 'POST': 
     form = SomeForm(request.POST) 
     if form.is_valid(): 
      picked = form.cleaned_data.get('picked') 
      # do something with your results 
    else: 
     form = SomeForm 

    return render_to_response('some_template.html', {'form':form }, 
     context_instance=RequestContext(request)) 

some_template.html

<form method='post'> 
    {{ form.as_p }} 
    <input type='submit' value='submit'> 
</form> 

resultados:

checkboxselectmultiple

explicación:

opciones:

El primer elemento de cada tupla es la valor real para ser almacenados. El segundo elemento es el nombre legible para humanos para la opción.

conseguir cajas seleccionadas:

form.cleaned_data.get('picked') dará como resultado una lista de los 'valores reales'. Por ejemplo, si sustituye la # do something with your results con print picked ves:

[u'a', u'c'] 

en su consola

+0

Muchas gracias ... realmente me ha aclarado las cosas. Todavía tengo una pregunta más. Cuando trato de manejar los resultados, trato de manejar cada elemento de la lista como u'a 'o solo la cadena' a '. – Bigdinrock

+0

¡esta es una muy buena respuesta! ¡gracias! – user1451340

+1

¿Cómo tomar una lista de nombres legibles por humanos? Necesito tomar la lista de la segunda opción de tupla. –

0

Esto se puede comprobar https://pypi.python.org/pypi/django-multiselectfield/

from multiselectfield import MultiSelectField 

# ... 

MY_CHOICES = (('item_key1', 'Item title 1.1'), 
      ('item_key2', 'Item title 1.2'), 
      ('item_key3', 'Item title 1.3'), 
      ('item_key4', 'Item title 1.4'), 
      ('item_key5', 'Item title 1.5')) 

MY_CHOICES2 = ((1, 'Item title 2.1'), 
      (2, 'Item title 2.2'), 
      (3, 'Item title 2.3'), 
      (4, 'Item title 2.4'), 
      (5, 'Item title 2.5')) 

class MyModel(models.Model): 

    # ..... 

    my_field = MultiSelectField(choices=MY_CHOICES) 
    my_field2 = MultiSelectField(choices=MY_CHOICES2, 
          max_choices=3, 
          max_length=3) 
Cuestiones relacionadas