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.
} 

現在、上記のコードで何かを POST しようとすると、次のようなエラーが発生します。

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)

1 つの例外は、フォームに引数が 1 つしかない場合dataです。これは、引数の順序を台無しにするのを避けるのに役立ちます (これがエラーの原因です)。

于 2012-04-17T04:03:00.937 に答える