使用Ajax调用来更新Django视图

时间:2014-01-07 21:51:13

标签: ajax django

我是Django的新手,并且我试图获取从ajax发送的变量以便在Django视图中使用。我的观点:

def index(request):
  if (request.is_ajax()):
    username = request.GET['user']
  else:
    username = ''
  context = {'user':username}
  return render(request, 'index.html', context)

和ajax:

$.ajax({ 
  url: '/index/', 
  type: 'GET', 
  data: {user: response.name, page: page} 
});

我的问题是,基于ajax调用,username在视图中不会更新。我知道ajax调用正常工作,因为在查看网络响应​​时,它正在传递正确的更新用户名。

我认为发生的是视图已加载,然后发生ajax调用并更新用户名,但视图不会重新呈现,因此不会更改。我在尝试获取用户名之后尝试了另一个渲染,但是没有改变任何东西,我也为处理ajax调用创建了一个单独的视图,但这似乎也没有用,因为视图总是在没有ajax请求的情况下加载是真的。

让这个工作的方法是什么?谢谢你的帮助。

2 个答案:

答案 0 :(得分:7)

如果您打算通过Ajax返回一个JavaScript,然后JavaScript可以用来更新您的DOM,您需要返回HttpResponse,最好是JSON格式,可以传递给$ .ajax中的处理程序呼叫。例如:

import json

from django.contrib.auth.models import User
from django.http import HttpResponse
from django.shortcuts import render


def index(request):
    if request.is_ajax():
        username = request.GET.get('user', '')
        user = User.objects.get(username=username)

        # do whatever processing you need
        # user.some_property = whatever

        # send back whatever properties you have updated
        json_response = {'user': {'some_property': user.some_property}}

        return HttpResponse(json.dumps(json_response),
            content_type='application/json')

    return render(request, 'index.html', {'user': ''})

然后在您的JavaScript中,您可以执行以下操作:

$.get('/index/', {user: response.name, page: page}, function(json_response) {
        console.log(json_response.user.some_property);
});

使用此方法,对视图的正常GET请求将返回呈现的HTML模板。对于Ajax请求,视图返回JSON格式的HttpResponse,它将传递给jQuery $ .get调用中的回调。

答案 1 :(得分:2)

要通过Ajax调用将数据发送到django视图,您需要将数据添加到Form,然后发送ajax请求。

实施例: 我的view.py:

def index(request):
"""
View function to handle Ajax request for image Link.
:param request: Ajax request data.
:return: image URL.
"""
if request.is_ajax():
    try:
         username = request.POST['username']
         # perform operations on the user name.

    except:
        e = sys.exc_info()
        return HttpResponse(e)
    return HttpResponse(sucess)
else:
    raise Http404

我的模板index.html

<html>
   <head>
      <title>Index</title>
      <script>
         $(document).ready(function() {
             $('#btnSubmit').click(function() {
                 var data = new FormData();
                 var username = $('#id_username').val()
                 data.append('username', username);
                 $.ajax({
                     type: 'POST',
                     url: 'getuser/',
                     data: data,
                     processData: false,
                     contentType: false,
                     success: function(json) {
                         alert(json);
                     }
                 })
             });
         });
                 
      </script>
   </head>
   <body>
      <h1>Index</h1>
      User name: <input type="text" name="fname" id="id_username">
      <input type="submit"  id ="btnSubmit" name="submit" value="Send Test Push">
   </body>
</html>

在此之后,你需要在urls.py中添加ajax调用url。