由ajax生成时,formset的提交按钮不起作用

时间:2017-08-01 10:48:17

标签: javascript python html ajax django

我有一个formset来更新我的模型,我根据搜索查询显示我的formset中的表单。我有一个ajax keyup函数来发送帖子请求,所以我可以生成search_results.html,然后我将其传递给search.html。

现在,如果我动态生成表单,则提交按钮不起作用。如果我放弃搜索并将search_results.html的内容直接传递给search.html,它确实有效。

我有两个视图,SearchReportView应该是主视图,SearchReports用于处理生成报告。我想我可能会在这一点上合并它们 - 但它并没有解决我的问题。

此外,当我使用多个表单时,我还有这个工作,但我不得不切换到一个formset。

search.html的主体

<div class="container">

        <div class="navbar">
            <div class="navbarItem">
                <a href="{% url 'EnbListView' %}"><img src="{% static 'back.png' %}" width="20px" height="12px" \>Back</a>
            </div>
        </div>

    <div>
        <h3>Search:</h3>
        {% csrf_token %}
        <input type="text" id="search" name="search" />
                <span class="button-checkbox">
                <button id="mybutton" type="button" class="btn" data-color="primary">Recent</button>
                <input type="checkbox" class="hidden" name="reports_checkbox" checked />
                </span>
    </div>

        <div class="normalText" id="search-results"></div>

</div>

search_results.html

                    {% if reports_and_formset %}
                    <form action="/TP/auto/report/search/" method="post" enctype="multipart/form-data"> {% csrf_token %}
                    {{ formset.management_form }}
                    {% for x, form in reports_and_formset %}

                            <button type="submit" class="button" >Submit</button>
                            {{ form.checking_user }}
                            {{ form.comment }}
                            {% for hidden in form.hidden_fields %}
                                {{ hidden }}
                            {% endfor %}

                    {% endfor %}
                    </form>
                {% else %}
                    <tr> <td> <center>
                    No results found.
                    </center></td></tr>
                {% endif %}

views.py

class SearchReportView(FormView):

def post(self, request, *args, **kwargs):
    # form = ReportCommentForm(initial={'comment': ''})
    # context = {'form': form}

    if 'form-TOTAL_FORMS' in request.POST:

        single_day_enb_reports = SingleDayEnbReport.objects.all()

        report_form_set = modelformset_factory(SingleDayEnbReport, form=ReportCommentForm,
                                               max_num=single_day_enb_reports.count())

        formset = report_form_set(request.POST, queryset=single_day_enb_reports)

        formset.save()

        return HttpResponseRedirect('/TP/auto/report/search/report_search/')

# @requires_csrf_token
def get(self, request, *args, **kwargs):
    return render(request, 'app/search.html')


class SearchReports(View):

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

    single_day_enb_reports = SingleDayEnbReport.objects.all()

    report_form_set = modelformset_factory(SingleDayEnbReport, form=ReportCommentForm, max_num=single_day_enb_reports.count())
    formset = report_form_set(queryset=single_day_enb_reports)

    single_day_enb_reports_and_formset = zip(single_day_enb_reports, formset)
    # context = {'single_day_enb_reports': single_day_enb_reports, 'formset': formset}
    context = {'reports_and_formset': single_day_enb_reports_and_formset, 'formset': formset}

    return render(request, 'app/search_results.html', context, context_instance=RequestContext(request))

@classmethod
def calculate_dates(self): #not important

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

    if 'form-TOTAL_FORMS' in request.POST:

        single_day_enb_reports = SingleDayEnbReport.objects.all()

        report_form_set = modelformset_factory(SingleDayEnbReport, form=ReportCommentForm,
                                               max_num=single_day_enb_reports.count())

        formset = report_form_set(request.POST, queryset=single_day_enb_reports)

        # if formset.is_valid():
        formset.save()

        return HttpResponseRedirect('/TP/auto/report/search/report_search/')

    if 'button_state' in request.POST:
        search_text = request.POST['search_text']
        button_state = request.POST['button_state']

        if button_state == 'false':
            button_state = False
        else:
            button_state = True

        if button_state:
            now, fit_date = self.calculate_dates()
            single_day_enb_reports = SingleDayEnbReport.objects.all().filter(
                                                         Q(last_modification_date__range=[fit_date, now]) & (
                                                         Q(alarms__contains=search_text)|
                                                         Q(enb__contains=search_text)|
                                                         Q(creation_date__date__contains=search_text) |
                                                         Q(last_modification_date__date__contains=search_text)|
                                                         Q(comment__contains=search_text)|
                                                         Q(checking_user__name__contains=search_text)))
        else:
            single_day_enb_reports = SingleDayEnbReport.objects.all().filter(
                                                         Q(alarms__contains=search_text)|
                                                         Q(enb__contains=search_text)|
                                                         Q(creation_date__date__contains=search_text) |
                                                         Q(last_modification_date__date__contains=search_text)|
                                                         Q(comment__contains=search_text)|
                                                         Q(checking_user__name__contains=search_text))

        report_form_set = modelformset_factory(SingleDayEnbReport, form=ReportCommentForm,
                                                   max_num=single_day_enb_reports.count())
        formset = report_form_set(queryset=single_day_enb_reports)

        single_day_enb_reports_and_formset = zip(single_day_enb_reports, formset)

        context = {'reports_and_formset': single_day_enb_reports_and_formset, 'formset': formset}
        return render_to_response('app/search_results.html', context, context_instance=RequestContext(request))

ajax.js

$('#search').keyup(function(){

delay(function(){
    if($('input[name=reports_checkbox]:checked').val()) button_state = true
    else button_state = false


        $.ajax({
            type: "POST",
            url: "/TP/auto/report/search/report_search/",
            data: {
                'button_state' : button_state,
                'search_text' : $('#search').val(),
                'csrfmiddlewaretoken' : $("input[name=csrfmiddlewaretoken]").val()
                },
            success: searchSuccess,
            dataType: 'html'
        });
 }, 500 );

});
});

    function searchSuccess(data, textStatus, jqXHR){
    //generated data is put into search-results <div>field in search.html
    $('#search-results').html(data);
}

1 个答案:

答案 0 :(得分:0)

请更改此行

$('#search').keyup(function(){

$(document).on('keyup','#search', function(){