Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Django Formset在post上没有数据_Javascript_Jquery_Python_Django_Formsets - Fatal编程技术网

Javascript Django Formset在post上没有数据

Javascript Django Formset在post上没有数据,javascript,jquery,python,django,formsets,Javascript,Jquery,Python,Django,Formsets,我有一个使用多个表单集的表单。表单集表单是通过JS动态添加的。我一直在寻找几个不同的地方来帮助自己 及 我遇到的问题是,当我发布数据时,外部表单中有数据,但当我开始循环时,我的表单集中没有一个在数据字典中有任何数据。有没有想过我可能会错过什么?第二个表单集添加了一个非常类似的JS方法 表格 class ShippingForm(Form): is_partial = BooleanField(label='Partial?') class ShippingActualProduc

我有一个使用多个表单集的表单。表单集表单是通过JS动态添加的。我一直在寻找几个不同的地方来帮助自己

我遇到的问题是,当我发布数据时,外部表单中有数据,但当我开始循环时,我的表单集中没有一个在数据字典中有任何数据。有没有想过我可能会错过什么?第二个表单集添加了一个非常类似的JS方法

表格

class ShippingForm(Form):
    is_partial = BooleanField(label='Partial?')


class ShippingActualProduct(Form):

    box_no = CharField(label='Box Number', max_length=3)
    upc = CharField(
        widget=forms.TextInput(attrs={'class':'upcAjax'}),
    )
    serial_no = CharField(
        label='Serial Number',
        widget=forms.TextInput(attrs={'class':'serial'}),
    )
    sku = CharField(
        widget=forms.TextInput(attrs={'class':'skuAjax'}),
    )
    description=CharField(label='Description')
    on_hand=CharField(label='On Hand')

    def __init__(self, *args, **kwargs):
        super(ShippingActualProduct,self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.form_show_labels = True
        self.helper.form_class = 'form-inline'


class ShippingNonInventoryProduct(Form):

    non_box_no = CharField(label='Box Number', max_length=3)
    quantity = IntegerField()
    description = CharField()
    serial_no = CharField()

    def __init__(self, *args, **kwargs):
        super(ShippingNonInventoryProduct,self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.form_show_labels = True
        self.helper.form_class = 'form-inline'



ActualProductFormSet = formset_factory(ShippingActualProduct, extra=1,       can_delete=True)
NonInventoryProductFormSet = formset_factory(ShippingNonInventoryProduct, extra=1, can_delete=True)
    class ShippingCreate(FormView):
    template_name = 'jinja2/Shipping/shipping_create.html'
    form_class = ShippingForm
    success_url = reverse_lazy('shipping_create')


    def get_context_data(self, **kwargs):

        context = super(ShippingCreate, self).get_context_data(**kwargs)
        input_invoice_no = self.request.GET['invoice_no']
        try:
            self.object = Invoice.objects.get(invoice_no = input_invoice_no)
            context['invoice'] = self.object
        except Invoice.DoesNotExist:
            messages.error(self.request, 'We were unable to find invoice number %s, please try again' % input_invoice_no)

        try:
            context['voucher'] = Voucher.objects.get(voucher_no = self.object.voucher_no)
        except Voucher.DoesNotExist:
            messages.error(self.request, 'We were unable to find an installation voucher for claim number %s' % self.object.voucher_no)

        context['actual_items_forms'] = ActualProductFormSet(prefix='actual')
        context['non_inventory_items_forms'] = NonInventoryProductFormSet(prefix='non')
        context['form'] = ShippingForm()
        return context

    def get(self, request, *args, **kwargs):

        self.object = None
        context = self.get_context_data()
        return render(request, self.template_name, context)

    def post(self, request, *args, **kwargs):
        self.object = None
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        actual_product = ActualProductFormSet(self.request.POST, prefix='actual')
        non_inv_product = NonInventoryProductFormSet(self.request.POST, prefix='non')
        if actual_product.is_valid():
            for product in actual_product:
                data = product.cleaned_data
                sku = data.get('sku')
        context={}
        return render(request, self.template_name, context)
视图

class ShippingForm(Form):
    is_partial = BooleanField(label='Partial?')


class ShippingActualProduct(Form):

    box_no = CharField(label='Box Number', max_length=3)
    upc = CharField(
        widget=forms.TextInput(attrs={'class':'upcAjax'}),
    )
    serial_no = CharField(
        label='Serial Number',
        widget=forms.TextInput(attrs={'class':'serial'}),
    )
    sku = CharField(
        widget=forms.TextInput(attrs={'class':'skuAjax'}),
    )
    description=CharField(label='Description')
    on_hand=CharField(label='On Hand')

    def __init__(self, *args, **kwargs):
        super(ShippingActualProduct,self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.form_show_labels = True
        self.helper.form_class = 'form-inline'


class ShippingNonInventoryProduct(Form):

    non_box_no = CharField(label='Box Number', max_length=3)
    quantity = IntegerField()
    description = CharField()
    serial_no = CharField()

    def __init__(self, *args, **kwargs):
        super(ShippingNonInventoryProduct,self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.form_show_labels = True
        self.helper.form_class = 'form-inline'



ActualProductFormSet = formset_factory(ShippingActualProduct, extra=1,       can_delete=True)
NonInventoryProductFormSet = formset_factory(ShippingNonInventoryProduct, extra=1, can_delete=True)
    class ShippingCreate(FormView):
    template_name = 'jinja2/Shipping/shipping_create.html'
    form_class = ShippingForm
    success_url = reverse_lazy('shipping_create')


    def get_context_data(self, **kwargs):

        context = super(ShippingCreate, self).get_context_data(**kwargs)
        input_invoice_no = self.request.GET['invoice_no']
        try:
            self.object = Invoice.objects.get(invoice_no = input_invoice_no)
            context['invoice'] = self.object
        except Invoice.DoesNotExist:
            messages.error(self.request, 'We were unable to find invoice number %s, please try again' % input_invoice_no)

        try:
            context['voucher'] = Voucher.objects.get(voucher_no = self.object.voucher_no)
        except Voucher.DoesNotExist:
            messages.error(self.request, 'We were unable to find an installation voucher for claim number %s' % self.object.voucher_no)

        context['actual_items_forms'] = ActualProductFormSet(prefix='actual')
        context['non_inventory_items_forms'] = NonInventoryProductFormSet(prefix='non')
        context['form'] = ShippingForm()
        return context

    def get(self, request, *args, **kwargs):

        self.object = None
        context = self.get_context_data()
        return render(request, self.template_name, context)

    def post(self, request, *args, **kwargs):
        self.object = None
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        actual_product = ActualProductFormSet(self.request.POST, prefix='actual')
        non_inv_product = NonInventoryProductFormSet(self.request.POST, prefix='non')
        if actual_product.is_valid():
            for product in actual_product:
                data = product.cleaned_data
                sku = data.get('sku')
        context={}
        return render(request, self.template_name, context)
模板

    {% extends "base.html" %}
{% load crispy_forms_tags %}
{%  load static from staticfiles %}
{%  load socialaccount %}
{%  load sitetree %}
{% block headcss %}
    {{ block.super }}
    <link rel="stylesheet" href="{%  static "css/shipping.css" %}">
{% endblock headcss %}
{%  block headjs %}
    {{ block.super }}
    <script src="{%  static "js/shipping.js" %}"></script>

{%  endblock headjs %}
{% block content %}
    {% block messages %}
        {{ block.super }}
    {% endblock messages %}

    <div class="container-fluid">
        <form action="." method="post">
            <div>
                <h3>Item information:</h3>
                        {%  csrf_token %}
                        {{ actual_items_forms.management_form }}
                        <div id="actual-items-form-container">
                        </div>
                        <a href="#" id="actual-item-btn" class="btn btn-info fa fa-plus-square add-item"> Add Item</a>
            </div>
            <div>
                <h3>Non Inventory Items Shipped:</h3>
                    {{ non_inventory_items_forms.management_form }}
                    <div id="non-inv-items-form-container">
                    </div>
                    <a href="#" id="add-non-inv-item-btn" class="btn btn-info fa fa-plus-square add-non-item"> Add Item</a>
            </div>
            {{  form.as_p }}
            <input type="submit" value="Complete" class="submit btn btn-success" />
        </form>

    </div>

    {%  include "jinja2/hub/loading_modal.html" %}
{% endblock content %}
</html>
{%extends“base.html”%}
{%load crispy_forms_tags%}
{%load static from staticfiles%}
{%load socialaccount%}
{%load sitetree%}
{%block headcss%}
{{block.super}}
{%endblock headcss%}
{%block headjs%}
{{block.super}}
{%endblock headjs%}
{%block content%}
{%block messages%}
{{block.super}}
{%endblock消息%}
项目信息:
{%csrf_令牌%}
{{实际项目\表格.管理\表格}
装运的非库存物品:
{{non_inventory_items_forms.management_form}
{{form.as_p}}
{%include“jinja2/hub/loading_modal.html”%}
{%endblock内容%}
JavaScript文件

    function getNewActualItemForm() {
        // unbind this ajax call from the overlay displayed when looking data up.
        $(document).unbind(".items");
        var count = $('#actual-items-form-container').children().length;
        $.get("/forms/actualitemform",function(data, status){
            var form = data.replace(/__prefix__/g, count);
            // Get the html contents of the form, all together to iterate over.
            var htmlForm = $('<form>').html(form).contents();
            // Just grab the children of that form
            var rows = htmlForm.children();
            // loop through the inputs locating the DELETE input and label.
            $(rows).each( function(index, value) {
                var row = $(this);
                var del = $(row).find('input:checkbox[id $= "-DELETE"]');
                // Only move forward if we have found the DELETE input
                if (del.length){
                    //Write the form ot the Dom so the search for the label will succeed.
                    $('div#actual-items-form-container').append(form);
                    var label ='label[for="id_form-' + count + '-DELETE"]';
                    $(label).hide();
                }
            });

            // update form count
            $('#id_actual-TOTAL_FORMS').attr('value', count+1);

            // some animate to scroll to view our new form
            $('html, body').animate({
                scrollTop: $('#actual-item-btn').position().top-200
            }, 800);

            // get the max box number.
            var maxBoxNo = getBoxNo();

            // Set focus to the next UPC
            var boxID = '#id_form-var-box_no';
            var upcID = '#id_form-var-upc';
            var nextBox = boxID.replace('var',count);
            var nextUpc = upcID.replace('var',count);
            // set the box number for the new line.
            $(nextBox).val(maxBoxNo);
            $(nextUpc).focus();


        });
        return count;
    }
函数getNewImplementForm(){ //从查找数据时显示的覆盖中取消绑定此ajax调用。 美元(文件)。解除绑定(“.items”); 变量计数=$(“#实际项目形成容器”).children().length; $.get(“/forms/actualitemform”,函数(数据、状态){ var form=data.replace(/\uuuuu前缀\uuuuu/g,计数); //获取表单的html内容,所有内容一起迭代。 var htmlForm=$('').html(form.contents(); //抓住那张表的孩子们 var rows=htmlForm.children(); //通过输入循环查找删除输入和标签。 $(行)。每个(函数(索引、值){ var行=$(此); var del=$(行).find('input:checkbox[id$=”-DELETE“]); //只有在找到删除输入时才向前移动 if(删除长度){ //将表单写入Dom,以便成功搜索标签。 $('div#实际项目表单容器')。追加(表单); var label='label[for=“id_form-'+count+'-删除”]; $(label.hide(); } }); //更新表格计数 $('id#u actual-TOTAL_FORMS').attr('value',count+1); //一些动画可以滚动查看我们的新表单 $('html,body')。设置动画({ scrollTop:$(“#实际项目btn”).position().top-200 }, 800); //获取最大箱号。 var maxBoxNo=getBoxNo(); //将焦点设置为下一个UPC var-boxID=“#id_form-var-box_no”; var-upcID='#id_form-var-upc'; var nextBox=boxID.replace('var',count); var nextUpc=upcID.replace('var',count); //设置新行的框编号。 $(nextBox).val(maxBoxNo); $(nextUpc.focus(); }); 返回计数; }
有两个问题导致了这里的问题

  • 我让CrispyForms助手为每个表单集呈现表单标签。这是个坏主意。设置form_tag=False修复了该问题
  • 我忘了在我创建的视图中为我的表单集设置前缀参数,以便通过JavaScript获取下一个表单
    一旦这两项措施都得到实施,提交时就可以从表格中获得数据。

    您怎么知道?您的
    post
    方法不会处理已清理的数据,也不会将无效表单返回到模板。抱歉,Daniel,我应该指定。我使用Pycharm并使用他们的调试器逐步完成代码。这就是为什么我停止在岗位上前进,因为我没有得到任何形式的回报。