ошибка в поле формы - PullRequest
       2

ошибка в поле формы

1 голос
/ 23 марта 2019

Я делаю форму транзакции накладной, я создал набор форм, для которого я хочу, чтобы Django игнорировал транзакции элемента, если элемент не выбран и пуст.

forms.py

class Delivery_note_transiction_form(forms.Form):

    item = forms.CharField(widget=Select2Widget(attrs={"class" : "item"}),label=False,required=False)
    description = forms.CharField(widget=forms.TextInput(attrs={ 'placeholder' : 'optionall','class' : 'description'}),label=False,required=False)
    quantity = forms.IntegerField(widget=forms.NumberInput(attrs={'class' : 'quantity'}),label=False,min_value=1)
    id = forms.CharField(widget=forms.HiddenInput,required=False)

Delivery_note_transiction_form_formset = forms.formset_factory(Delivery_note_transiction_form,extra=1)

views.py

def feedback(request):
     if request.method == "POST" and request.is_ajax():
         form = Deliver_Note_Main_Modelform(request.POST)
         formset = Delivery_note_transiction_form_formset(request.POST,request.FILES)
    if form.is_valid() and formset.is_valid():

        ins = form.save(commit=False)
        ins.author = request.user

        result = Customer_data.objects.get(pk=form.cleaned_data['customer'])

        ins.customer_list = result
        ins.save()


        max_invoice = Invoice_max.objects.get(invoice_name='delivery')
        max_invoice.invoice_no = max_invoice.invoice_no + 1
        max_invoice.save()

        print(formset)
        for instant in formset:
            if instant.cleaned_data['item']:

                item = Product.objects.get(pk=instant.cleaned_data['item'])
                description = instant.cleaned_data['description']
                quantity = instant.cleaned_data['quantity']
                Delivery_Note_Transiction.objects.create(
                item=item,
                description=description,
                quantity=quantity,
                delivery_invoice_no=ins
            )

        return JsonResponse({'success':True, 'next' : reverse_lazy('delivery note:delivery note home page')})

    else:
        return render(request,"delivery_note/ajax/delivery note error message.html",{"error" : form, "transiction_error": formset})
return HttpResponse("Hello from feedback!")

template.html

{% for delivery in delivery_transiction %}
    <tr class=" delivery_form ">
        <td class="col-sm-4">{{ delivery.item|as_crispy_field }}</td>
        <td class="col-sm-4">{{ delivery.description|as_crispy_field }}</td>
        <td class="col-sm-4">{{ delivery.quantity|as_crispy_field }}</td>
    </tr>
{% endfor %}

Почтовые данные отправляются Ajax, и выбранная опция создается в шаблоне. Когда он загружен, Ajax добавляет новую строку. Проблема в том, что я хочу игнорировать запись транзакции, если элемент не выбран или пуст, но когда я его запускаю, выдается следующее сообщение:

"KeyError: 'item'"

Следует игнорировать пустые или не выбранные элементы. Это происходит только тогда, когда товар не выбран в транзакции. Я хочу исправить эту ошибку, чтобы она просто игнорировала строки, в которых элемент не выбран.

1 Ответ

1 голос
/ 23 марта 2019

Вы должны использовать try except при поиске в словаре ключа.

for instant in formset:
    try:
        item = Product.objects.get(pk=instant.cleaned_data['item'])
    Except KeyError:
        # What to do if no 'item'.

Вам придется выяснить, куда поместить оставшуюся часть кода, но это поможет вам преодолеть KeyError.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...