使用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 令牌标头