2011-12-16 9 views
10

Nie mogę przechwycić wartości z unit_id po dokonaniu wyboru przez użytkownika i opublikowaniu danych. Czy ktoś może mi pomóc rozwiązać ten problem?Formularze django dają: Wybierz prawidłowy wybór. Ten wybór nie jest jednym z dostępnych wyborów

Wartości z rozwijanej listy unit_id są uzyskiwane z innej tabeli bazy danych (LiveDataFeed). Po wybraniu wartości i wysłaniu formularza pojawia się błąd:

Wybierz poprawny wybór. Ten wybór nie jest jednym z dostępnych wyborów.

Oto realizacja:

w 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) 

W 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

Czy zmiana '.distinct' na' .distinct() 'pomaga? –

+0

To był literówka powyżej ... jest już zakodowana jako .distinct() ... – user1102171

Odpowiedz

8

Dostaniesz płaską value_list z powrotem, które będzie po prostu listą identyfikatorów, ale kiedy yo rób to, prawdopodobnie lepiej jest użyć zwykłego ChoiceField zamiast ModelChoiceField i dostarczyć mu listę krotek, nie tylko identyfikatorów. Na przykład:

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()) 

Można też zostawić go jako ModelChoiceField i używać LiveDataFeed.objects.all() jako queryset, ale aby wyświetlić identyfikator w polu, jak również mieć go wypełnić do wartości opcji, którą należy podklasę ModelChoiceField zastąpić metodę label_from_instance. Możesz zobaczyć example in the docs here.

+0

Dzięki Dan. To jest moja implementacja. {{Iquery = LiveDataFeed.objects.values_list ("unit_id", flat = True) .distinct() iquery_choices = [('', 'None')] + [(str (id), str (id)) dla id w iquery] print "Wybory są:", iquery_choices unit_id = forms.ChoiceField (choices = iquery_choices)}} – user1102171

1

Zanim zadzwonisz form.is_valid(), wykonaj następujące czynności:

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

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

Teraz można zadzwonić form.is_valid() a forma potwierdzi poprawnie.