У меня есть форма, которая позволяет мне сначала выбрать тип продукта, а затем выбрать продукт. Поскольку у меня есть более 1000 продуктов, я использую следующее, чтобы отфильтровать список продуктов для повышения производительности.Django - Отключить проверку поля формы
У меня есть следующий inlineform в моем 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 для обновления выпадающего меню Product) я получаю сообщение об ошибке экономии , Я знаю, это потому, что выбор не является вариантом в раскрывающемся списке.
Мой вопрос: Как я могу отключить эту ошибку, так что сохраняет возможность я выбран, независимо от исходных параметров.
Ниже вы найдете мой 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. В этом случае вам необходимо вручную обработать эту ситуацию и повторно использовать параметры формы продукта. – sobolevn
, когда вы говорите, что используете JQuery для обновления продукта - что вы на самом деле делаете? Вы запускаете ajax для получения новых продуктов для заполнения выбранного? – professorDante
Да - при изменении выпадающего списка типа продукта – phicon