2013-03-24 20 views
8

Ho un modulo con ModelChoiceField e voglio caricare su di esso una tabella dal mio DB. Se io uso questo set di query su init di mia forma, quindi form.is_valid del mio punto di vista funziona bene:Django - Come funziona ModelChoiceField di queryset?

self.fields['categoria_formfield'].queryset = sitio_categoria.objects.exclude(categoria='patrimonio').values_list('idCategoria',flat=True) 

enter image description here

Quel codice mostrano la lista di un id sulla ModelChoiceField, ma quello che ho bisogno è di mostrare le categorie elenco. Quindi io uso:

self.fields['categoria_formfield'].queryset = sitio_categoria.objects.exclude(categoria='patrimonio').values_list('categoria',flat=True) 

Ma usando questo codice .is_valid non convalidare e ho recive un errore di forma: "Selezionare una scelta valida Tale scelta non è una delle scelte avaliable.". Qualche indizio su quale potrebbe essere il problema?

Error recived

MODELLO

class sitio_categoria(models.Model): 
    idCategoria   = models.AutoField(primary_key=True) 
    categoria   = models.CharField(max_length=30, null=False, unique=True) 

FORM

class anadirComercioPaso1_form(forms.Form): 
     categoria_formfield = forms.ModelChoiceField(widget=forms.Select(attrs={'size':'13', 'onchange':'this.form.action=this.form.submit()'}), queryset=sitio_categoria.objects.none()) 

def __init__(self, *args, **kwargs): 
     super(anadirComercioPaso1_form, self).__init__(*args,**kwargs) 
     self.fields['categoria_formfield'].queryset = sitio_categoria.objects.exclude(categoria='patrimonio').values_list('categoria',flat=True) 

risposta

13

Non utilizzare values_list, (o values), ModelChoiceField ha bisogno di oggetti del modello attuale.

queryset = sitio_categoria.objects.exclude(categoria='patrimonio') 

 

ModelChoiceField utilizzerà le chiavi primarie degli oggetti per la convalida e la loro rappresentazione Unicode per la visualizzazione. Quindi sarà necessario definire la conversione a Unicode nel tuo modello:

class sitio_categoria(models.Model): 
    idCategoria = models.AutoField(primary_key=True) 
    categoria = models.CharField(max_length=30, null=False, unique=True) 

    def __unicode__(self): 
     return self.categoria 

 

ModelChoiceField documentation

The __unicode__ method of the model will be called to generate string representations of the objects for use in the field’s choices;

Problemi correlati