【发布时间】:2015-07-17 22:21:30
【问题描述】:
我有一个表单,可以让我先选择产品类型,然后再选择产品。由于我有 1000 多种产品,因此我使用以下内容过滤产品列表以提高性能。
我的views.py中有以下内联格式
OrderLineFormSet = inlineformset_factory(OrderHeader, OrderLine, OrderLineForm, extra = 1)
在我的 forms.py 中,我检查是否已经选择了产品。如果选择了产品,我只显示具有相同产品类型的产品以提高负载性能。如果产品为空,它将加载所有产品选项,以便我在选择后保存表单。
class OrderLineForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(OrderLineForm, self).__init__(*args, **kwargs)
self.helper = FormHelper(self)
self.helper.form_show_errors = True
self.helper.error_text_inline = False
if self.instance.product is not None:
self.fields['product'] = forms.ModelChoiceField(queryset=Product.objects.filter(product_type_id=self.instance.product_type_id), required=False)
这会产生以下形式
但是,当我在现有表单上更改产品类型(然后使用 jQuery 更新产品下拉菜单)时,我得到一个错误保存。我知道这是因为选择不是下拉列表中的选项。
我的问题:如何禁用此错误,以便保存我选择的选项,而不管原始选项如何。
您将在下面找到此表单的 views.py
def orderline_formset(request, id=None):
OrderLineFormSet = inlineformset_factory(OrderHeader, OrderLine, OrderLineForm, extra = 1)
orderheader = None
orderid = None
orderheaderid = 0
if id:
orderid = OrderHeader.objects.get(pk=id)
if request.POST:
if orderid:
form = OrderHeaderForm(request.POST, instance=orderid)
formset = OrderLineFormSet(request.POST,instance=orderid)
else:
form = OrderHeaderForm(request.POST)
formset = OrderLineFormSet(request.POST)
if form.is_valid() and formset.is_valid():
if orderid:
form.save() # update object
else:
orderid = form.save() # create object
formset.instance = orderid
formset.save()
messages.success(request, 'Order saved succesfully!')
return HttpResponseRedirect('/orderline_formset/' + str(orderid.pk))
else: # form invalid
messages.error(request, 'Order save error, please check mandatory fields')
else: # request.GET
if orderid:
invoiceheader = ""
if orderid.orderheader_invoice:
invoiceheader = " -- Invoice " + str(orderid.orderheader_invoice)
orderheader = "Order " + str(orderid.pk) + invoiceheader
orderheaderid = orderid.pk
form = OrderHeaderForm(instance=orderid)
formset = OrderLineFormSet(instance=orderid)
else:
orderheader = "New Order"
orderheaderid = 0
form = OrderHeaderForm(instance=OrderHeader())
formset = OrderLineFormSet(instance=OrderHeader())
return render_to_response("order-add.html", {'form' : form,'formset': formset,
'orderheader': orderheader,
'orderheaderid': orderheaderid},
context_instance=RequestContext(request))
【问题讨论】:
-
如果我没看错,您可以在产品表单中选择一些选项。当您通过选择新的产品类型来更改现有订单时,它会加载旧产品表单中未显示的新产品。所以它会抛出一个ValidationError。在这种情况下,您需要手动处理这种情况并重新指定产品表单选项。
-
当您说您使用 JQuery 更新产品下拉列表时 - 您实际上是做什么的?您是否运行 ajax get 来获取新产品以填充选择?
-
是 - 更改产品类型下拉菜单
-
如果你使用jQuery发送一个ajax请求来更新Product Type,那么必须有一些函数来处理这个请求。我认为您可以更改该函数中的验证选项。
标签: python django forms django-crispy-forms