Python Django中POST请求中使用可选参数验证自定义表单时出错

Python Django中POST请求中使用可选参数验证自定义表单时出错,python,django,django-forms,django-views,Python,Django,Django Forms,Django Views,因此,我创建了一个自定义的ModelForm,它为queryset引入了一个变量creator\u list,如下所示: class UserModelChoiceField(ModelChoiceField): def label_from_instance(self, obj): return obj.get_full_name() class OrderCreateForm(ModelForm): class Meta: model=Ord

因此,我创建了一个自定义的
ModelForm
,它为
queryset
引入了一个变量
creator\u list
,如下所示:

class UserModelChoiceField(ModelChoiceField):
    def label_from_instance(self, obj):
        return obj.get_full_name()

class OrderCreateForm(ModelForm):
    class Meta:
        model=Order
        fields=('work_type', 'comment',)

    def __init__(self, creator_list=None, *args, **kwargs):
        super(OrderCreateForm, self).__init__(*args, **kwargs)

        if creator_list:
            self.fields['creator'] = UserModelChoiceField(
                queryset=creator_list,
                empty_label="Select a user",
                widget=Select(attrs={
                    'onchange': "Dajaxice.doors.orders_create_creator_changed(fill_other_fields, {'creator_pk': this.options[this.selectedIndex].value})"
                })
            )

        self.fields['place'] = UserModelChoiceField(
            queryset=User.objects.none(),
            empty_label="Select a creator first"
        )
user = request.user
dictionary = get_order_create_dictionary(user)

if request.method == 'POST':
    #import ipdb; ipdb.set_trace()

    form = OrderCreateForm(request.POST)

    if form.is_valid():
        creator   = form.cleaned_data['creator']
        place     = form.cleaned_data['place']
        work_type = form.cleaned_data['work_type']
        comment   = form.cleaned_data['comment']

        new_order = Order.objects.create(
            creator  =creator,
            place    =place,
            work_type=work_type,
            comment  =comment
        )

        messages.success(request, "Your order #{} had been created!".format(new_order.pk))
        logger.info("{user} created order #{pk}".format(user=user, pk=new_order.pk))

        return HttpResponseRedirect(reverse('orders_detail', kwargs={'pk': new_order.pk}))
    else:
        return render(request, 'doors/orders/create.html', {'form': form, 'can_assign_creator': dictionary['can_assign_creator']})
else:
    if dictionary:
        return render(request, 'doors/orders/create.html', {
            'form': OrderCreateForm(creator_list=dictionary['creator_list']),
            'can_assign_creator': dictionary['can_assign_creator']
        })
    else:
        return HttpResponseRedirect(reverse('orders_list'))
dictionary = {
    'creator_list': Order.objects.all(), # Or some kind of filtered Order.
    'can_assign_order: 1, # Or 0. This variable is used in the template to control access to what gets displayed.
} 
当我只是简单地显示字段时,一切都很完美。然而,在一次提交后。我得到的错误,我不知道如何调试

我的
views.py
如下所示:

class UserModelChoiceField(ModelChoiceField):
    def label_from_instance(self, obj):
        return obj.get_full_name()

class OrderCreateForm(ModelForm):
    class Meta:
        model=Order
        fields=('work_type', 'comment',)

    def __init__(self, creator_list=None, *args, **kwargs):
        super(OrderCreateForm, self).__init__(*args, **kwargs)

        if creator_list:
            self.fields['creator'] = UserModelChoiceField(
                queryset=creator_list,
                empty_label="Select a user",
                widget=Select(attrs={
                    'onchange': "Dajaxice.doors.orders_create_creator_changed(fill_other_fields, {'creator_pk': this.options[this.selectedIndex].value})"
                })
            )

        self.fields['place'] = UserModelChoiceField(
            queryset=User.objects.none(),
            empty_label="Select a creator first"
        )
user = request.user
dictionary = get_order_create_dictionary(user)

if request.method == 'POST':
    #import ipdb; ipdb.set_trace()

    form = OrderCreateForm(request.POST)

    if form.is_valid():
        creator   = form.cleaned_data['creator']
        place     = form.cleaned_data['place']
        work_type = form.cleaned_data['work_type']
        comment   = form.cleaned_data['comment']

        new_order = Order.objects.create(
            creator  =creator,
            place    =place,
            work_type=work_type,
            comment  =comment
        )

        messages.success(request, "Your order #{} had been created!".format(new_order.pk))
        logger.info("{user} created order #{pk}".format(user=user, pk=new_order.pk))

        return HttpResponseRedirect(reverse('orders_detail', kwargs={'pk': new_order.pk}))
    else:
        return render(request, 'doors/orders/create.html', {'form': form, 'can_assign_creator': dictionary['can_assign_creator']})
else:
    if dictionary:
        return render(request, 'doors/orders/create.html', {
            'form': OrderCreateForm(creator_list=dictionary['creator_list']),
            'can_assign_creator': dictionary['can_assign_creator']
        })
    else:
        return HttpResponseRedirect(reverse('orders_list'))
dictionary = {
    'creator_list': Order.objects.all(), # Or some kind of filtered Order.
    'can_assign_order: 1, # Or 0. This variable is used in the template to control access to what gets displayed.
} 
get\u order\u create\u dictionary()

class UserModelChoiceField(ModelChoiceField):
    def label_from_instance(self, obj):
        return obj.get_full_name()

class OrderCreateForm(ModelForm):
    class Meta:
        model=Order
        fields=('work_type', 'comment',)

    def __init__(self, creator_list=None, *args, **kwargs):
        super(OrderCreateForm, self).__init__(*args, **kwargs)

        if creator_list:
            self.fields['creator'] = UserModelChoiceField(
                queryset=creator_list,
                empty_label="Select a user",
                widget=Select(attrs={
                    'onchange': "Dajaxice.doors.orders_create_creator_changed(fill_other_fields, {'creator_pk': this.options[this.selectedIndex].value})"
                })
            )

        self.fields['place'] = UserModelChoiceField(
            queryset=User.objects.none(),
            empty_label="Select a creator first"
        )
user = request.user
dictionary = get_order_create_dictionary(user)

if request.method == 'POST':
    #import ipdb; ipdb.set_trace()

    form = OrderCreateForm(request.POST)

    if form.is_valid():
        creator   = form.cleaned_data['creator']
        place     = form.cleaned_data['place']
        work_type = form.cleaned_data['work_type']
        comment   = form.cleaned_data['comment']

        new_order = Order.objects.create(
            creator  =creator,
            place    =place,
            work_type=work_type,
            comment  =comment
        )

        messages.success(request, "Your order #{} had been created!".format(new_order.pk))
        logger.info("{user} created order #{pk}".format(user=user, pk=new_order.pk))

        return HttpResponseRedirect(reverse('orders_detail', kwargs={'pk': new_order.pk}))
    else:
        return render(request, 'doors/orders/create.html', {'form': form, 'can_assign_creator': dictionary['can_assign_creator']})
else:
    if dictionary:
        return render(request, 'doors/orders/create.html', {
            'form': OrderCreateForm(creator_list=dictionary['creator_list']),
            'can_assign_creator': dictionary['can_assign_creator']
        })
    else:
        return HttpResponseRedirect(reverse('orders_list'))
dictionary = {
    'creator_list': Order.objects.all(), # Or some kind of filtered Order.
    'can_assign_order: 1, # Or 0. This variable is used in the template to control access to what gets displayed.
} 
目前,使用上述代码,当我尝试发布某些内容时,会出现如下错误:

AttributeError: 'QueryDict' object has no attribute 'all'
on the line "return render(request, 'doors/orders/create.html', {'form': form, 'can_assign_creator': dictionary['can_assign_creator']})"
我认为这与行
form=OrderCreateForm(request.POST)
有关,所以我将其更改为
form=OrderCreateForm(request.POST,creator\u list=dictionary['creator\u list'])
。但是我得到了这个错误:

TypeError: __init__() got multiple values for keyword argument 'creator_list'
on the line "form = OrderCreateForm(request.POST, creator_list=dictionary['creator_list'])"
我不知道如何解决这个问题。我感谢任何帮助或提示!谢谢

编辑:


我将行更改为
form=OrderCreateForm(dictionary['creator\u list',request.POST)
现在验证工作正常,但它不允许我提交有效的帖子。它一直在说
选择一个有效的选项。该选项不是可用选项之一。
对于
位置
。这可能与我如何使用Ajax使用
place
填充
有关,具体取决于
创建者是什么

form = OrderCreateForm(creator_list=dictionary['creator_list'], data=request.POST)
一个例外是当表单只有一个参数时,
数据
。这将帮助您避免弄乱参数顺序(这是您在此处出错的原因)