2011-12-16 68 views
10

在用戶完成選擇併發布數據後,我無法捕捉到unit_id中的值。有人可以幫我解決這個問題嗎?django表單給出:選擇一個有效的選項。該選擇不是可用選項之一

unit_id下拉列表的值是從另一個數據庫表(LiveDataFeed)獲得的。並且一旦選擇了一個值併發布了表單,它會給出錯誤:

選擇一個有效的選項。該選擇不是可用選擇之一。

下面是執行:

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

在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

是否將`.distinct`改爲`.distinct()`幫助? – 2011-12-16 15:21:46

+0

這是一個錯字以上...它已被編碼爲.distinct()... – user1102171 2011-12-16 15:32:12

回答

8

你得到一個平坦的VALUE_LIST返回這將只是一個ID列表,但是當你喲你這樣做,你最好使用一個簡單的ChoiceField而不是一個ModelChoiceField並提供一個元組列表,而不僅僅是id。例如:

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

你也可以把它作爲一個ModelChoiceField,並使用LiveDataFeed.objects.all()作爲查詢集,但爲了顯示框中的ID,以及有它填充的選項值,你會必須繼承ModelChoiceField以覆蓋label_from_instance方法。你可以看到一個example in the docs here

1

你打電話form.is_valid()之前,請執行下列操作:

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

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

現在,您可以撥打form.is_valid()和您的形式將正確驗證。

相關問題