将信息从javascript传递到django应用程序并返回

将信息从javascript传递到django应用程序并返回,javascript,python,ajax,django,Javascript,Python,Ajax,Django,因此,我尝试建立一个网页,用户在其中选择一个id,然后该网页将id信息发送给python,python使用该id查询数据库,然后将结果返回给该网页以供显示 我不太清楚怎么做。我知道如何使用ajax调用调用python生成的数据,但我不确定如何将初始id信息传递给django应用程序。是否可以说,查询一个类似于./app/id(IE/app/8)的url,然后使用url信息为python提供信息?我该如何编辑url.py和views.py才能做到这一点 谢谢,是的,这是可能的。如果将id作为参数传

因此,我尝试建立一个网页,用户在其中选择一个id,然后该网页将id信息发送给python,python使用该id查询数据库,然后将结果返回给该网页以供显示

我不太清楚怎么做。我知道如何使用ajax调用调用python生成的数据,但我不确定如何将初始id信息传递给django应用程序。是否可以说,查询一个类似于./app/id(IE/app/8)的url,然后使用url信息为python提供信息?我该如何编辑url.py和views.py才能做到这一点


谢谢,

是的,这是可能的。如果将id作为参数传递给将在应用程序内部使用的视图,如:
def示例视图(请求,id)
在URL.py中,您可以使用如下内容:
url(r'^example\u view/(?P\d+)/,“App.views.example\u view”)


url
/example\u view\u template/8
中的id将使用与数字8相关的id访问结果。例如,与数据库中特定表的第8条记录类似。

是的,这是可能的。如果将id作为参数传递给将在应用程序内部使用的视图,如:
def示例视图(请求,id)
在URL.py中,您可以使用如下内容:
url(r'^example\u view/(?P\d+)/,“App.views.example\u view”)


url
/example\u view\u template/8
中的id将使用与数字8相关的id访问结果。例如,与数据库中特定表的第8条记录类似。

关于如何从ajax请求/URL中捕获信息,通常可以像在普通django请求中一样,检查并阅读官方文档中的django视图

关于如何返回响应,只需捕获参数,处理您的请求,然后以适当的类型给出响应


有时您必须将数据转换为另一种格式,如json,这种格式可以在客户端/js中更有效地处理。关于如何从ajax请求/URL中捕获信息,通常您可以像在普通django请求中一样,检查并阅读官方文档中的django视图

关于如何返回响应,只需捕获参数,处理您的请求,然后以适当的类型给出响应


有时,您必须将数据转换为另一种格式,如json,它可以在客户端/js中更有效地处理。您正在谈论的是AJAX。AJAX总是需要3个部分(从技术上讲,只有两个:Javascript有双重功能)

  • 客户端(本例中为Javascript)发出请求
  • 服务器(本例中为Django视图)处理请求并返回响应
  • 客户端(同样是Javascript)接收响应并对其进行处理
  • 您还没有指定一个首选框架,但是如果没有某种Javascript框架就使用AJAX,那就太疯狂了,所以我将为您选择jQuery。代码可以很容易地适应任何Javascript框架:

    $.getJSON('/url/to/ajax/view/', {foo: 'bar'}, function(data, jqXHR){
        // do something with response
    });
    
    我使用的是
    $.getJSON
    ,这是一种jQuery便利方法,它向URL发送GET请求,并自动将响应解析为JSON,将其转换为Javascript对象,在此处作为
    数据传递。第一个参数是请求将发送到的URL(稍后将详细介绍),第二个参数是包含应随请求一起发送的数据的Javascript对象(如果不需要发送任何数据,则可以省略该参数),第三个参数是回调函数,用于处理成功后服务器的响应。这段简单的代码涵盖了上面列出的第1部分和第3部分

    下一部分是处理程序,在本例中,它当然是Django视图。视图的唯一要求是必须返回JSON响应:

    from django.utils import simplejson
    
    def my_ajax_view(request):
        # do something
        return HttpResponse(simplejson.dumps(some_data), mimetype='application/json')
    
    请注意,除了必需的
    请求
    ,此视图不接受任何参数。这是一个哲学上的选择。依我看,在真正的REST方式中,数据应该与请求一起传递,而不是在URL中,但是其他人可以也确实不同意。最终的选择取决于你

    另外,请注意,这里我使用了Django的simplejson库,它最适合于常见的Python数据结构(列表、dict等)。如果要返回Django模型实例或queryset,则应使用序列化程序库

    from django.core import serializers
    ...
    data = serializers.serialize('json', some_instance_or_queryset)
    return HttpResponse(data, mimetype='application/json')
    
    现在您有了一个视图,只需将其连接到Django的urlpatterns中,这样Django就知道如何路由请求

    urlpatterns += patterns('',
        (r'^/url/to/ajax/view/$', 'myapp.views.my_ajax_view'),
    )
    
    这就是哲学上的差异所在。如果选择通过URL本身传递数据,则需要在URL模式中捕获数据:

    (r'^/url/to/ajax/view/(?P<some_data>[\w-]+)/$, 'myapp.views.my_ajax_view'),
    
    最后,修改Javascript AJAX方法以将其包含在URL中:

    $.getJSON('/url/to/ajax/view/'+some_data+'/', function(data, jqXHR){
    
    如果使用请求传递数据,则需要注意在视图中正确检索数据:

    def my_ajax_view(request):
        some_data = request.GET.get('some_data')
        if some_data is None:
            return HttpResponseBadRequest()
    
    这应该足以让您在Django中使用任何AJAX功能。其他一切都与视图如何检索数据(手动创建数据、查询数据库等)以及Javascript回调方法如何处理JSON响应有关。关于这一点,有几点建议:

  • 数据
    对象通常是一个列表,即使只包含一项。如果您知道只有一项,则可以使用
    data[0]
    。否则,使用for循环访问每个项目:

    form (var i=0; i<data.length; i++) {
        // do something with data[i]
    }
    
  • 一般来说,在处理JSON响应和AJAX时,最好先在浏览器中直接尝试,以便查看确切的响应和/或验证响应的结构。要在浏览器中查看JSON响应,您很可能需要exstention。JSONView(可用于和)将使它能够理解JSON并将其显示为网页。如果请求是GET,则可以使用querystring以正常的GET方式将数据传递到URL,即
    http://mydomain.com/url/to/ajax/view/?some_data
    
    form (var i=0; i<data.length; i++) {
        // do something with data[i]
    }
    
    data[i].some_key