2011-11-06 15 views
6
from django import forms 

class SignUpForm(forms.Form): 
    birth_day = forms.ChoiceField(choices=range(1,32)) 

que estoy recibiendo "TypeError Atrapados mientras que la prestación: objeto 'int' no es iterable". https://docs.djangoproject.com/en/dev/ref/models/fields/#field-choices dice que el argumento de opciones toma iterables como una lista o tupla.gama Django Formulario ChoiceField(): Object 'int' no iterable

http://docs.python.org/library/functions.html#range dice range() crea una lista.

¿Por qué me sale un error?

Intenté convertir la lista a str usando map() pero recibí diferentes errores.

Respuesta

15

... dice que el argumento de opciones toma elementos como una lista o tupla.

No, dice que se necesita un iterable de 2-tuplas.

Un iterable (por ejemplo, una lista o tupla) de 2 tuplas para usar como opciones para este campo.

birth_day = forms.ChoiceField(choices=((str(x), x) for x in range(1,32))) 
+1

Funciona, parece que debo tener cuidado al leer. La solución tiene un paréntesis adicional que debe eliminarse. – deadghost

+0

Lo que hace. –

+0

@ IgnacioVazquez-Abrams: ¿hay alguna razón por la que use generador en lugar de lista o tupla? http://stackoverflow.com/questions/16940293/why-is-there-no-tuple-comprehension-in-python – noisy

0

Se necesitan 2 tuplas. Usar zip función incorporada por las mismas tuplas 2

from django import forms 


class SignUpForm(forms.Form): 

    birth_day = models.IntegerField(choices=list(zip(range(1, 32), range(1, 32))), unique=True) 

Recuerde (1,32) creará entre 1 y 31!

Cuestiones relacionadas