【问题标题】:post function in django formview not called when jquery post is used使用jquery post时未调用django formview中的post函数
【发布时间】: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 模式中添加它的任何地方

标签: jquery ajax django jquery-ui django-forms


【解决方案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

下载

【讨论】:

    猜你喜欢
    • 2015-03-09
    • 1970-01-01
    • 2018-02-15
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    相关资源
    最近更新 更多