2014-01-07 2 views
3

Я новичок в Django и пытаюсь получить переменную, отправленную из ajax, которая будет использоваться в представлении 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({ 
    url: '/index/', 
    type: 'GET', 
    data: {user: response.name, page: page} 
}); 

Моя проблема заключается в том, что username не обновляет в представлении, на основе вызова Ajax. Я знаю, что вызов ajax работает правильно, потому что, глядя на сетевой ответ, он передает правильное обновленное имя пользователя.

Я уверен, что происходит то, что представление загружено, затем происходит вызов ajax и обновляет имя пользователя, но представление не перерисовывается и, следовательно, не изменяется. Я попытался поместить другой рендер после получения имени пользователя, но это ничего не изменило, и я также сделал отдельное представление для обработки вызова ajax, но это тоже не работает, поскольку представление всегда загружается без запроса ajax правда.

Каков способ заставить это работать? Спасибо за любую помощь.

+0

Что вы получаете от ответа ajax? Что вы с ним делаете? Если вы добавите 'complete: function (resp) {...}' к вашему запросу ajax, что такое 'resp.responseText' внутри этой функции? – jproffitt

+0

Извините, также немного новичок с ajax. Если I console.log текст ответа, он регистрирует обновленную страницу индекса с новым именем пользователя. Так что я должен просто перезагрузить страницу с успехом? – mcw

+0

Возможно, вы замените DOM новым DOM. Но это крайне неэффективно. Вам действительно нужно вернуть только имя пользователя и обновить его. Посмотрите на ответ Брэндона за помощью. где он имеет 'console.log (json.user);' Сделайте что-то вроде '$ ('# username'). html (json.user)' – jproffitt

ответ

6

Если вы хотите вернуть ответ через Ajax, который 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 представление возвращает HttpResponse в формате JSON, который передается обратному вызову в вызове jQuery $ .get.

+0

Я получаю сообщение об ошибке «Ответ» не определен, исходя из строки 'json.dumps (response)'. – mcw

+0

Извините, это моя вина. Я сделал несколько рефакторингов по имени переменной ответа. Я обновил свой ответ для вас. – Brandon

+0

Удивительно, что правильно обновил DOM. Но есть ли способ, чтобы обновленное имя пользователя использовалось в представлении? Как-то получить эту ценность и использовать ее для индекса. Индекс в реальном приложении запускает запрос с именем пользователя в качестве аргумента, и поэтому мне интересно, как получить это новое имя пользователя для более позднего запроса. Спасибо за вашу помощь! – mcw

2

Чтобы отправить данные в режим просмотра django с помощью вызова Ajax, вам необходимо добавить данные в форму и затем отправить запрос 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>

После этого вам нужно добавить Ajax вызова URL в URL-адресов .py.

Смежные вопросы