したがって、次のようなModelForm
変数を受け取るカスタムを作成しました。creator_list
queryset
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>
を使用して にデータを入力する方法と関係があります。place
creator