【问题标题】:Passing JSON data from views to html via ajax in Django在Django中通过ajax将JSON数据从视图传递到html
【发布时间】:2015-06-05 13:40:19
【问题描述】:

我无法使用通过 ajax 从视图传递的 JSON 数据来呈现 html 模板。我从视图中得到了正确的 JSON 格式,我可以在 console.log(response) 中看到正确的响应,但是当我从浏览器运行这个 url http://127.0.0.1:8000/our-stores/ 时,我得到了这个结果:

[{'fields': {'address': 'Kilpolantie 16',
             'city': 'Helsinki',
             'country': 'Finland',
             'name': 'K-market'},
  'model': 'shoppire.supermarket',
  'pk': 1},
 {'fields': {'address': 'Kontulankari 16',
             'city': 'Helsinki',
             'country': 'Finland',
             'name': 'S-market'},
  'model': 'shoppire.supermarket',
  'pk': 2}]

但是我应该得到ourstores.html文件而不是这个输出。请找到下面的代码:

models.py

class Supermarket(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=50)
    city = models.CharField(max_length=60)
    country = models.CharField(max_length=50)

    def __unicode__(self):
        return self.name

urls.py

urlpatterns = [
    url(r'^our-stores/$','shoppire.views.ourstores',name='ourstores'),
    url(r'^admin/', include(admin.site.urls)),
]

views.py

def ourstores(request):

    stores_list = Supermarket.objects.all()

    response_data = serializers.serialize('json',stores_list)

    return HttpResponse(response_data,content_type="application/json")

ourstores.html

{% extends 'base.html' %}

{% block content %}

<div class='col-sm-12' style='text-align:center'>
    <h2>Check out our stores:</h2>

    <div id="show_stores" onload="ShowStores()"></div>

    <div id="results"></div>

</div>

{% endblock %}

ShowStores.js

$(document).ready(function(){
    ShowStores();
});
function ShowStores() {
    console.log("show stores is working");

    $.ajax({

        url : "our-stores",
        type : "GET",
        dataType : "json",
        success: function(response){

            $.each(response,function(index){
                $('#results').append(response[index].fields.name);
                console.log(response[index].fields.name);
        });

        console.log(response);
        console.log("success");

    },
    error : function(xhr,errmsg,err) {
        $('#show_stores').html("<div class='alert-box alert radius' data-alert>Oops! We have encountered an error: "+errmsg+
            " <a href='#' class='close'>&times;</a></div>"); // add the error to the dom
        console.log(xhr.status + ": " + xhr.responseText); // provide a bit more info about the error to the console
    } 

    });

};

非常感谢!

【问题讨论】:

  • 你为什么希望 jQuery 从 JSON 渲染 HTML?
  • 我希望 jQuery 从视图中获取响应并在 html 中显示该响应。
  • 所有 jQuery 要做的就是将从请求返回的 JSON 附加到 DOM。 JSON 不会神奇地转换成 HTML。

标签: javascript python ajax django


【解决方案1】:

您不会在ourstores 视图中的任何位置呈现ourstores.html 模板。为了显示模板,它必须由视图呈现。在您的情况下,如果请求是 AJAX,您希望呈现 JSON,如果请求不是 AJAX,则要呈现实际模板。

您的视图可能如下所示:

def ourstores(request):
    if request.is_ajax():
       stores_list = Supermarket.objects.all()

       response_data = serializers.serialize('json',stores_list)

       return HttpResponse(response_data,content_type="application/json")

    return render(request, 'ourstores.html')

【讨论】:

  • 感谢您的回复。正如您所写,我渲染了模板,但没有从视图返回 JSON 数据。我希望视图将数据发送回 ajax 调用,并将返回的数据显示在模板上。
  • 嗯,应该的。通过 AJAX 调用视图时检查 request.is_ajax() 是否为 True
  • @Moki 您可以尝试的另一件事是更改 AJAX 请求的 URL 以附加斜杠 (url : "our-stores/")。如果您打开了APPEND_SLASH,AJAX 请求将被重定向并丢失将其标记为 AJAX 的标头。
  • request.is_ajax() 返回 false 所以可能 ajax 调用中的 url 不正确。我尝试了斜线,但它也是错误的。
  • 您可以在 AJAX 请求 URL 中粘贴一个 GET 参数并检查它是否存在于视图中。例如:url : "our-stores?ajax=1",然后使用 request.GET.get('ajax') 代替 request.is_ajax()
【解决方案2】:

如果您要求 JSON 响应,您将得到 JSON 响应。 如果要渲染模板,请使用以下内容:

def ourstores(请求):

stores_list = Supermarket.objects.all()

response_data = serializers.serialize('json',stores_list)

return render_to_response('our_stores.html',
                      response_data,
                      context_instance=RequestContext(request))

然后,在您的模板中使用传递的数据作为 {{response_data}}

【讨论】:

  • 感谢您的回复。在这种情况下,我排除了 javacript 和 ajax 并直接从视图中呈现模板。我希望 html 通过 ajax 将 json 数据的请求发送到视图,然后视图将数据发送回 ajax,然后将它们插入到 html 标记中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-15
相关资源
最近更新 更多