0

所以我有ModelForm一个我创建的自定义,它接受一个变量creator_listqueryset如下所示:

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

当我只是显示字段时,一切都很完美。但是在 POST 提交期间。我收到不知道如何调试的错误。

我的views.py样子是这样的:

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

get_order_create_dictionary()简单地返回一个看起来像这样的字典:

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_list=dictionary['creator_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_list'], request.POST),现在验证有效,但它不会让我提交有效的 POST。它一直Select a valid choice. That choice is not one of the available choices.在说place。这可能与我如何根据实际情况使用 Ajax 来<option>填充。placecreator

4

1 回答 1

1

您最好只使用命名参数来实例化 Form 实例,即

form = OrderCreateForm(creator_list=dictionary['creator_list'], data=request.POST)

一个例外是当表单只有一个参数时 - data. 这将帮助您避免弄乱参数顺序(这是您在此处出错的原因)。

于 2012-04-17T04:03:00.937 回答