2011-12-16 30 views
10

Tôi không thể nắm bắt các giá trị từ unit_id sau khi lựa chọn được thực hiện bởi người dùng và dữ liệu được đăng. Ai đó có thể giúp tôi giải quyết vấn đề này.biểu mẫu django cung cấp: Chọn một lựa chọn hợp lệ. Lựa chọn đó không phải là một trong các lựa chọn có sẵn

Giá trị của danh sách thả xuống unit_id được lấy từ một bảng cơ sở dữ liệu khác (LiveDataFeed). Và khi giá trị được chọn và biểu mẫu được đăng, nó sẽ cho lỗi:

Chọn một lựa chọn hợp lệ. Lựa chọn đó không phải là một trong những lựa chọn có sẵn.

Đây là việc thực hiện:

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

Trong 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

Có thay đổi trợ giúp '.distinct' thành' .distinct() 'không? –

+0

Đó là lỗi đánh máy trên ... nó đã được mã hóa là .distinct() ... – user1102171

Trả lời

8

Bạn đang nhận được một VALUE_LIST phẳng trở lại mà sẽ chỉ là một danh sách các id, nhưng khi yo u làm điều đó, có lẽ bạn nên sử dụng một số ChoiceField đơn giản thay vì một số ModelChoiceField và cung cấp danh sách các bộ dữ liệu chứ không chỉ là các id. Ví dụ:

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

Bạn cũng có thể rời khỏi nó như là một ModelChoiceField, và sử dụng LiveDataFeed.objects.all() như queryset, nhưng để hiển thị id trong hộp cũng như có nó cư cho các giá trị tùy chọn, bạn muốn phải phân lớp ModelChoiceField để ghi đè phương thức label_from_instance. Bạn có thể thấy example in the docs here.

+0

Cảm ơn Dan. Đây là triển khai của tôi. {{Iquery = LiveDataFeed.objects.values_list ("unit_id", flat = True) .distinct() iquery_choices = [('', 'Không có')] + [(str (id), str (id)) cho id trong iquery] in "Lựa chọn là:", iquery_choices unit_id = forms.ChoiceField (choices = iquery_choices)}} – user1102171

1

Trước khi bạn gọi form.is_valid(), làm như sau:

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

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

Bây giờ bạn có thể gọi form.is_valid() và hình thức của bạn sẽ xác nhận một cách chính xác.

Các vấn đề liên quan