由于值在列表中,Django发布数据导致错误

时间:2016-01-20 05:22:26

标签: python django forms

我正在尝试从表单std::terminate获取数据,但数据中的一个值导致错误:

POST

表单数据:

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_light,这是assign_to

User是一个pks列表,这似乎导致了一个问题。

views.py:

assign_to

forms.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)

因此,我的表单始终无效,因为它不期望列表: 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。任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

您应该能够直接传递request.POST,而不是将dict转换为self.form = form_class(data=request.POST)

例如:

<button id="myButton" onclick="alert('Hi!')"> 

这是因为request.POST是MultiValueDict的一个实例,它允许每个键有多个值。