2011-12-16 2 views
10

Non riesco a rilevare i valori dal unit_id dopo che la selezione è stata effettuata dall'utente e i dati sono stati pubblicati. Qualcuno può aiutarmi a risolvere questo.forme django danno: selezionare una scelta valida. Quella scelta non è una delle scelte disponibili

I valori dell'elenco unit_id vengono visualizzati da un'altra tabella di database (LiveDataFeed). E una volta selezionato un valore e inviato il modulo, viene visualizzato l'errore:

Selezionare una scelta valida. Quella scelta non è una delle scelte disponibili.

Ecco l'attuazione:

in models.py:

class CommandData(models.Model): 
    unit_id = models.CharField(max_length=50) 
    command = models.CharField(max_length=50) 
    communication_via = models.CharField(max_length=50) 
    datetime = models.DateTimeField() 
    status = models.CharField(max_length=50, choices=COMMAND_STATUS) 

In views.py:

class CommandSubmitForm(ModelForm): 
    iquery = LiveDataFeed.objects.values_list('unit_id', flat=True).distinct() 
    unit_id = forms.ModelChoiceField(queryset=iquery, empty_label='None', 
     required=False, widget=forms.Select()) 

class Meta: 
    model = CommandData 
    fields = ('unit_id', 'command', 'communication_via') 

def CommandSubmit(request): 
    if request.method == 'POST': 
     form = CommandSubmitForm(request.POST) 
     if form.is_valid(): 
      form.save() 
      return HttpResponsRedirect('/') 
    else: 
     form = CommandSubmitForm() 

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

Sostituisce '.distinct' a' .distinct() 'help? –

+0

Quello era un errore sopra ... è già codificato come .distinct() ... – user1102171

risposta

8

Stai diventando un value_list piatta indietro che sarà solo una lista degli id, ma quando lo farai Lo fai, probabilmente stai meglio usando un semplice ChoiceField invece di un ModelChoiceField e fornendogli un elenco di tuple, non solo id. Per esempio:

class CommandSubmitForm(ModelForm): 
    iquery = LiveDataFeed.objects.values_list('unit_id', flat=True).distinct() 
    iquery_choices = [('', 'None')] + [(id, id) for id in iquery] 
    unit_id = forms.ChoiceField(iquery_choices, 
           required=False, widget=forms.Select()) 

Si potrebbe anche lasciarlo come un ModelChoiceField, e utilizzare LiveDataFeed.objects.all() come il set di query, ma al fine di visualizzare l'ID nel box così come l'hanno popolare per i valori di opzione, che ci si sottoclasse ModelChoiceField per ignorare il metodo label_from_instance. È possibile vedere un example in the docs here.

+0

Grazie Dan. Questa è la mia implementazione. {{Iquery = LiveDataFeed.objects.values_list ("unit_id", flat = True) .distinct() iquery_choices = [('', 'None')] + [(str (id), str (id)) per id in iquery] stampa "Le scelte sono:", iquery_choices unit_id = forms.ChoiceField (choices = iquery_choices)}}} – user1102171

1

Prima di chiamare form.is_valid(), effettuare le seguenti operazioni:

  1. unit_id = request.POST.get('unit_id')

  2. form.fields['unit_id'].choices = [(unit_id, unit_id)]

Ora è possibile chiamare form.is_valid() e il modulo sarà convalidare correttamente.