2016-01-20 23 views
0

我試圖從表單POST得到的數據是,但在數據值的一個原因造成的錯誤:Django的數據後產生錯誤由於值列表中

ipdb> request.POST 
<QueryDict: {'assign_to-autocomplete': [''], 'tasks': ['18'], 'csrfmiddlewaretoken': ['lVqkbkYdz42uTtLJviRIj3OukcwqsdvI'], 'assign_to': ['14'], 'action_type': ['assign_to']}> 

表單數據:

ipdb> self.form.data 
{'assign_to-autocomplete': [''], 'tasks': ['18'], 'csrfmiddlewaretoken': ['lVqkbkYdz42uTtLJviRIj3OukcwqsdvI'], 'assign_to': ['14'], 'action_type': ['assign_to']} 

我使用autocomplete_lightassign_to場,這是一個User

assign_to是一個pks的列表,這似乎是造成問題。

views.py:

class TasksPreviewView(MyMixin, FormView): 
    ''' An intermediate page ''' 
    template_name = 'tasks/task_preview.html' 

    def post(self, request): 
     import ipdb; ipdb.set_trace() 
     self.action_type = request.POST['action_type'] 
     form_class = self.get_form() 
     self.form = form_class(data=dict(request.POST)) 

     if self.form.is_valid(): 
      return self.form_valid(self.form) 
     else: 
      return self.form_invalid(self.form) 

forms.py:

class TaskBulkAssignToForm(forms.ModelForm): 
    tasks = forms.ModelMultipleChoiceField(queryset=Task.objects.all(), label='') 
    assign_to = al.ModelChoiceField('UserStaffAutocomplete', queryset=User.objects.all(), required=True, label='Select a user') 

    def __init__(self, *args, **kwargs): 
     ''' Filter down to the tasks of interest and set tasks as a hidden field ''' 
     super().__init__(*args, **kwargs) 
     task_pks = (self.initial or self.data)['tasks'] 
     self.fields['tasks'].queryset = self.fields['tasks'].queryset.filter(
      pk__in=task_pks, 
     ) 
     self.fields['tasks'].widget.attrs['class'] = 'hidden' 

    def post_valid(self): 
     ''' Called by form_valid ''' 
     # Do some processing 
     # Return a success message 

    def post_invalid(self): 
     ''' Called by form_invalid ''' 
     # Return an error message 

    class Meta: 
     model = Task 
     fields = ('tasks', 'assign_to') 

由於這樣的結果,我的狀態始終是無效的,因爲它不希望一個列表: django.core.exceptions.ValidationError: ['Select a valid choice. That choice is not one of the available choices.']相反的user_pk,如'14',['14']通過request.POST。如果我手動將值調整爲'14'而不是['14']continue,則表單按預期工作得很漂亮。

對於某些情況下,TasksPreviewView是一種中間頁面,類似於Django admin page。每個批量操作都有其自己的格式(在此例中爲assign_to操作)。第一頁使用表單重定向到中間頁面,但保留GET中的所有對象。第二頁(確認頁)執行POST。任何人都可以幫我解決這個問題嗎?

回答

2

不是轉換request.POSTdict的,你應該能夠通過它直接:

例如:

self.form = form_class(data=request.POST) 

這是因爲request.POST是MultiValueDict的一個實例,它允許多個每個鍵的值。