使用jquery post时未调用django formview中的post函数

Posted

技术标签:

【中文标题】使用jquery post时未调用django formview中的post函数【英文标题】:post function in django formview not called when jquery post is used 【发布时间】:2018-10-03 22:24:17 【问题描述】:

点击“搜索”按钮时,我必须致电SearchView。通过一些打印语句,我可以看到正在调用 SearchView,但未调用 SearchView 中的 post 函数。

下面是我在 SearchView 中使用的代码:

    class SearchView(FormView):
        template_name = 'search.html'
        #form_class = SearchForm
        success_url = '/mypage/downloadresult'
        print(" i am inside SearchView")

        def post(self, request, *args, **kwargs):
            # form = self.form_class(request.POST)
            form_class =SearchForm
            form = self.get_form(form_class)
            # form_class = self.get_form_class()
            # form = self.get_form(form_class)
            print(" i am inside post")

            if form.is_valid():
                if self.request.is_ajax():
                   // handle form and generate result

下面是我的表单的显示视图:

    class DisplayView(FormView):
        template_name = 'search.html'
        form_class = SearchForm
        print(" i am inside displayview")
        success_url = '/sampleapp/search'

当使用上面的DisplayView 显示表单时,一旦用户点击“搜索”按钮,成功的表单发布就会调用SearchView

示例应用中的网址模式:

    urlpatterns = [
        #url('', SearchView.as_view()),
        #url('', SearchView.as_view()),
        url('', displayformview.DisplayView.as_view(), name='displayview'),
        url(r'^search/$', SearchView.as_view(), name='search'),
        url(r'^downloadresult/$', downloadresultview.DownloadResultView.as_view(), name='downloadresult')
    ]

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^', include(‘sampleapp.urls')),
    ]

下面是我正在使用的jquery:

 $('#search').click(function()
    $.post('/sampleapp/search', $(this).serialize(), function()
        //alert("submit called")
    )
    .done(function()
        alert("done")
    )
)

我不确定上面的 jquery 是否真的在发送表单数据。如果有人能帮助我了解如何使用 jquery 发送表单数据并成功调用 post 函数,那将非常有帮助。

我尝试使用 print 语句进行调试。我可以看到 SearchView 中的 post 函数从未被调用,并且“我在 post 中”从未在控制台中打印。

【问题讨论】:

实际上,您告诉 jquery 在该 url '/sampleapp/search 中发布,而我在您的 django 代码中没有看到您在 url 模式中添加它的任何地方 【参考方案1】:

永远不会调用 SearchView,因为您在此处设置的网址 $.post('/sampleapp/search' 不存在。

试试

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^', include(‘sampleapp.urls')), ---- remove that line
    url(r'^sampleapp/', include(‘sampleapp.urls'))
]

urlpatterns = [
    #url('', SearchView.as_view()),
    #url('', SearchView.as_view()),
    url('', displayformview.DisplayView.as_view(), name='displayview'),
    url(r'^sampleapp/search/$', SearchView.as_view(), name='search'),
    url(r'^downloadresult/$',  downloadresultview.DownloadResultView.as_view(), name='downloadresult')
]

【讨论】:

我试过上面的。正在调用 SearchView。所以我在控制台中打印了“我在 SearchView 中”。但控制不在 SearchView 中的“发布”功能内部。所以,“我在邮局里”永远不会被打印出来。我也收到“csrf 令牌丢失或不正确。但我在“search.html”的表单中添加了“% csrf token %”。 在您的控制台或浏览器中查看 jquery 是否命中了您的后端代码。如果出现服务器错误,您可能会看到 POST 200 或 304。或 POST 500 是的,它现在正在工作。但我现在有另一个问题。我已经在下面发布了。如果你能帮助我,那就太好了。【参考方案2】:

是的,它现在正在工作。但现在我有另一个问题:

我有一个搜索按钮,点击它会执行搜索。我希望用户能够下载下载按钮单击时生成的 zip 文件。我试过上面的代码。但是,只要我单击搜索按钮,就会发生下载。下载的文件是 .zip,点击后打开 .cpgz,没有任何数据。

下面是代码:

 def post(self,request,*args, **kwargs):
       zip_dir = "result_for_query_.zip".format(query_word)
       s = StringIO.StringIO()
       z = zipfile.ZipFile(s, 'w')
   filename = "_.txt".format(query_word, doc_id)
   # zip_dir = "result_for_query_.zip".format(query_word)
   z = zipfile.ZipFile(zip_dir, 'a')
   self.write_to_file(filename, doc, z)
   z.close()
  response = HttpResponse(s.getvalue(), content_type='application/zip')
  response["Content-Disposition"] = "attachment; filename=%s" % zip_dir
  return response

HTML

下载

【讨论】:

以上是关于使用jquery post时未调用django formview中的post函数的主要内容,如果未能解决你的问题,请参考以下文章

jQuery AJAX POST 在第一次调用时跳过 Django CSRF 令牌标头

单击提交时未调用Django视图功能

为啥在javascript中单击时未设置输入值?

从前一个控制器重定向时未调用 Post 方法

如何使用 javascript/jquery/AJAX 调用 Django REST API?

Jquery datatable 在从简单的 Web 服务调用 Web 方法时未在表中显示任何数据