Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >django视图+ AJAX:如何在表单POST之后检索数据

django视图+ AJAX:如何在表单POST之后检索数据
EN

Stack Overflow用户
提问于 2015-11-09 02:00:53
回答 3查看 995关注 0票数 0

我有一个查询表单,它可以从服务器上的数据生成一个大型json对象。理想情况下,在提交时,用户应该被重定向到从AJAX请求得到更新的结果页面(+进度栏),直到生成结果并准备显示为止。

当前,当用户提交表单时,当生成结果时,它们会被挂在queryForm页面上。在dataFromQuery完成后,实现回调的正确django方法是什么?

下面是基于类的视图的简化版本:

代码语言:javascript
运行
AI代码解释
复制
class QueryForm(generic.View):
form_class = ReturnQuery
template_name = 'myapp/form/queryForm.html'

    def get(self, request, *args, **kwargs):
    #render form
    return render(request, self.template_name, {'form': form})

    def post(self, request, *args, **kwargs):
    form = self.form_class(request.POST)

        if form.is_valid():
            # <process form cleaned data>
            print(request.POST)
            print(form.cleaned_data)
            # continues to build results object (json) which can take 
            # any length of time

        return render(request, 'myapp/form/queryResults.html', {
                    'dataFromQuery': dataFromQuery,
                })

我在POST方法中尝试了is_ajax():

代码语言:javascript
运行
AI代码解释
复制
 if request.is_ajax():
            results = { "progress" : {'progress':1} }
            try:
              dataFromQuery
            except NameError:
              dataFromQuery_exists = False
            else:
              dataFromQuery_exists = True
              results['data']=dataFromQuery

            return JsonResponse(results)

但是,一旦dataFromQuery完成,它就不会被传递给结果对象。

联署材料:

代码语言:javascript
运行
AI代码解释
复制
var refreshIntervalId = setInterval(function(){
    $.ajax({type: "POST",url: '/website/queryForm/', data: {csrfmiddlewaretoken : csrftoken}, dataType:'json', success: function(results){ //do something with results }})
});

我已经看过模板响应,但我不知道它们在这里如何帮助,因为在页面呈现完成后,回调看起来就执行了。任何帮助都将不胜感激。

编辑:我可能有点不清楚。results.progress是在成功的AJAX上检索的,但是这一行:结果‘’data‘=dataFromQuery在生成结果后不会更新。

EN

回答 3

Stack Overflow用户

发布于 2015-11-09 02:29:25

考虑使用一些任务队列/管理器,比如芹菜。只需创建将产生您的结果的任务,以某种方式监视它,并向用户显示创建响应的当前进度。

票数 0
EN

Stack Overflow用户

发布于 2015-11-09 02:30:24

HTTP适用于请求->响应。Django不能在没有请求的情况下将消息(如进度)“推”到浏览器。您可以做的是使用轮询,它每隔X秒发送一个ajax请求来获取状态。创建此解决方案并不那么简单,因为您需要一个返回进度的分离函数,并在分离线程(异步)中执行实际执行过程。

根据具体情况,一个更简单的解决方案是让用户知道数据正在被处理,例如使用一个微调器

票数 0
EN

Stack Overflow用户

发布于 2015-11-10 02:12:52

我目前正在发展一个非常类似的案例。你想做的事情并不是那么琐碎。不幸的是Django本质上是完全同步的,因此AJAX调用将在Python端阻塞。

正如已经建议的那样,使用某种任务管理工具。我使用芹菜,这是容易使用和充分结合在Django。

您的代码将如下所示

代码语言:javascript
运行
AI代码解释
复制
class QueryForm(generic.View):
    ...
    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST)
        token = generate_request_token()

        if form.is_valid():
           celery_task.apply_async(<token>, <parameters>) <-- this returns immediately

           return render(request, 'myapp/form/queryResults.html', {
                    'token': <token>,
                })

您的celery_task现在正在计算背景中的结果,并将在完成后存储结果。你想把结果存储在哪里是你的选择。

您仍然需要创建另一个Django端点才能得到结果。将其映射到www.yoursite.com/queryForm/data之类的地方。就像这样

代码语言:javascript
运行
AI代码解释
复制
def get(self, request, *args, **kwargs):
    #return data in JSON format
    return JsonResponse(get_data_from_storage(request.<token>))

get_data_from_storage将查看结果存储,并检查结果是否已就绪或部分就绪。(另一种方法是检查celery_task的状态。当它完成时,结果必须准备好)

然后在JS端,一旦用户提交QueryForm,他就被重定向到www.yoursite.com/queryResults.html/TOKEN (结果页面),或者找到将令牌传递到结果页面的方法。

现在您可以做的是使用令牌查询后端中属于该令牌的数据。一旦进入结果页面,就会执行类似的操作。

代码语言:javascript
运行
AI代码解释
复制
var refreshIntervalId = setInterval(function(){
    $.ajax({type: "GET", url: '/website/queryForm/data', data: {token: <token>}, dataType:'json', success: function(results){ if (results) {// do something} }})
});

上面的JS方法称为连续轮询,它不是最优的。(有关替代方案,请参阅Socket.io,但您将需要像Node.js这样的附加组件,我是这样做的)。渲染最终在前端完成。每次获得新结果时,都会使用新的数据更新页面。

还有其他的方法,但目前我觉得这是最直接的方法。

芹菜的替代品有:

  • 线程(如果你知道你在做什么)
  • 兔/ZeroMQ
  • 龙卷风(但可能不容易与Django集成)
  • 格事件
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33606571

复制
相关文章
POST表单数据
在之前的文章中,我们了解到了如何进行API的简单调用,这仅仅输入 GET类型的操作,而现在我们需要对网站进行POST。
摸鱼的G
2023/02/22
6960
Django 2.1.7 处理ajax请求、GET、POST请求
在业务处理的工作中,在同一个视图处理上,可能会有普通的GET、POST请求,还会有ajax请求。 那么怎么在处理这些请求的时候做上区分呢?
Devops海洋的渔夫
2019/09/18
1.5K0
Django 2.1.7 处理ajax请求、GET、POST请求
使用AJAX获取Django后端数据
使用Django服务网页时,只要用户执行导致页面更改的操作,即使该更改仅影响页面的一小部分,它都会将完整的HTML模板传递给浏览器。但是如果我们只想更新页面的一部分,则不必完全重新渲染页面-这时候就要用到AJAX了。
子润先生
2021/06/16
7.7K0
Django学习笔记 1.4 表单和通用视图
更新一下在上一个教程中编写的投票详细页面的模板 (“polls/detail.html”) ,增加一个 HTML 元素:
twowinter
2020/04/17
8190
Django MVT之V
在Django MVC概述和开发流程中已经讲解了Django的MVT开发流程,本文重点对MVT中的视图(View)进行重点讲解。
菜菜cc
2022/11/15
1.9K0
Django MVT之V
Django之视图层与模板层
视图函数(类)简称为视图,就是一个普通的函数(类),它的功能是接收web请求,并返回web响应.
GH
2019/12/16
9.3K0
011:Django高级表单
本章知识点 1、Django表单类 2、自定义文件上传 3、Ajax post数据
李玺
2021/11/22
3140
011:Django高级表单
通过Ajax提交表单的数据
当监听到表单的提交事件后,可以调用事件对象的 event.preventDefault()函数,来阻止表单的提交和页面的跳转,示例代码如下:
岳泽以
2022/10/26
2.4K0
ajax post请求之后 实现页面跳转和带参数跳转问题
url, {method:"regist",userName:$nameEle.val(),email:$emailEle.val(),password:$passwordEle.val()}, function(data) { //alert(data); //注册成功页面跳转, window.location.href ="../client/login.html"; }
wust小吴
2019/07/05
5.4K0
005:Django Form请求
1. Django 请求 传递数据的方式 Form表单 Ajax Url get请求 我们研究request参数 在视图当中,大部分函数有request参数,request这个参数是当URL调用视图函数的时候接收 传递的请求。 Request接收的就是一个请求 Request.META 请求当中携带的参数 HTTP_USER_AGENT:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0 浏览器版本 Form表单 Action 请求的地址 地址为空,请求自己的地址 Method 请求的方式 Post 发送,密文的 Get 获取,明文 在URL之后以?开始,以键=值的形式以&分割 Input name是传递参数时候的键 Submit
李玺
2021/11/22
5960
005:Django Form请求
Django之视图层
  一个视图函数,简称视图,是一个简单的python函数,接收web请求并返回web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误等。在函数中必须写一个request的参数,然后必须要有返回值,中间的逻辑随便,整个函数写在哪里也无所谓,只要python目录下就行,但我们默认规定,视图函数一般都写在每个应用下面views.py文件里。
py3study
2020/01/19
1.8K0
django 1.8 官方文档翻译: 3-4-3 使用基于类的视图处理表单
你自己实现这些功能经常导致许多重复的样本代码(参见在视图中使用表单)。为了避免这点,Django 提供一系列的通用的基于类的视图用于表单的处理。
ApacheCN_飞龙
2022/11/27
1.9K0
php接受不到ajax的post数据
今天我在开发中遇到了一种情况: 我从html头信息里可以看到post传过去的数据,甚至打印ajax返回的json也是可以,但唯独加上键以后就变成了undefined。也就是说js并没有识别该json 解决方法:eval()函数转换:eval() 函数会将传入的字符串当做 JavaScript 代码进行执行。
九霄道长
2021/03/02
1.7K0
django 用表单验证数据
使用Field可以是对数据验证的第一步。你期望这个提交上来的数据是什么类型,那么就使用什么类型的Field。
用户2200417
2023/01/29
6390
09.Django基础七之Ajax
    AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步的Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML,现在更多使用json数据)。
changxin7
2019/09/30
3.7K0
09.Django基础七之Ajax
Django数据库查询优化与AJAX
每一列属性都是不可再分的,两列的属性相近或相似或一样,应尽量合并属性一样的列,确保不产生冗余数据。
GH
2019/12/16
2.4K0
Django数据库查询优化与AJAX
Django 视图层
PyCharm可以使用virtualenv中的功能来创建虚拟环境。PyCharm紧密集成了virtualenv,所以只需要在setting中配置即可创建虚拟环境。而且PyCharm捆绑了virtualenv,我们不需要单独安装,一般创建过程如下:
py3study
2020/01/19
1.8K0
03.Django基础三之视图函数
  一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。
changxin7
2019/09/29
5K0
03.Django基础三之视图函数
100:Django完整学员管理项目、傻瓜式流程讲解
创建APP 1、切入项目目录 2、创建app (djangoProject) E:\pythonProject>cd STUDB
李玺
2021/11/22
5030
100:Django完整学员管理项目、傻瓜式流程讲解
Django:表单字段如何在模板中用中文
1、表单汉化:是针对用户的。用户浏览网页时,表单的名称如果是英文的,不够友好,所以需要显示为中文,虽然代码编写还是英文。 2、Admin后台汉化:是针对网站管理员的。因为Admin后台是数据库直接注册的,所以要想汉化后台内容,其实是对数据库(如字段名)操作的。2种汉化的对象不一样。
py3study
2020/01/16
1.6K0

相似问题

如何在Ajax post之后检索json编码的数据

30

Django:带有状态视图的POST表单(ajax?)

34

无法在django中使用ajax post请求检索表单数据

12

django表单post对象,如php

10

PHP/AJAX POST表单检索

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档