首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Ajax调用后使用Django模板呈现JSON对象

在Ajax调用后使用Django模板呈现JSON对象
EN

Stack Overflow用户
提问于 2009-05-19 11:36:21
回答 8查看 40.9K关注 0票数 67

我一直在尝试理解在Django中做Ajax的最佳方式是什么。通过在这里和那里阅读资料,我了解到常见的过程是:

  1. 使用一些JavaScript库(例如,jQuery)来格式化你的Ajax调用,在Django中设置一个URL模式,捕捉调用并将其传递给视图函数
  2. ,在Python视图函数中检索你感兴趣的对象,并将它们以JSON格式或类似的格式发送回客户端(通过使用内置的序列化模块,或者在JavaScript中simplejson)
  3. define一个接收JSON数据并解析它们的回调函数,从而创建需要显示的任何HTML.最后,JavaScript脚本将HTML放在它应该停留的位置。

现在,我仍然不明白的是,Django模板与这一切有什么关系?显然,我们根本没有利用模板的力量。理想情况下,我认为传递回一个JSON对象和一个模板名称会更好,这样就可以遍历数据并创建HTML块。但也许我完全错了..。

我发现这个方向的唯一资源是this snippet (769),但我还没有尝试过它。显然,在这种情况下会发生的情况是,所有生成的HTML都是在服务器端创建的,然后传递给客户端。JavaScript-callback函数只需将其显示在正确的位置。

这会导致性能问题吗?如果没有,即使不使用上面的代码片段,为什么不直接在后端使用Python格式化HTML,而不是在前端呢?

非常感谢!

更新:请使用 ,因为它是上面版本的增强版!我发现继承支持以这种方式工作得更好。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-05-19 18:29:25

嘿谢谢vikingosegundo!

我也喜欢使用装饰器:-)。但与此同时,我一直在遵循我上面提到的代码片段所建议的方法。只有一件事,用the snippet n. 942代替,因为它是原始版本的改进版本。下面是它的工作原理:

假设你有一个模板(例如,'subtemplate.html'),它包含一个你可以重用的有用的块:

代码语言:javascript
复制
     ........
    <div id="results">          
        {% block results %}
            {% for el in items %}
                   <li>{{el|capfirst}}</li>
            {% endfor %}
        {% endblock %}      
    </div><br />
     ........

通过在视图文件中导入上面的代码片段,您可以很容易地引用模板中的任何块。一个很酷的特性是,模板之间的继承关系被考虑在内,所以如果你引用一个包含另一个块的块,等等,一切都应该正常工作。因此,ajax-view如下所示:

代码语言:javascript
复制
from django.template import loader
# downloaded from djangosnippets.com[942]
from my_project.snippets.template import render_block_to_string

def ajax_view(request):
    # some random context
    context = Context({'items': range(100)})
    # passing the template_name + block_name + context
    return_str = render_block_to_string('standard/subtemplate.html', 'results', context)
    return HttpResponse(return_str)
票数 25
EN

Stack Overflow用户

发布于 2009-05-19 16:19:13

下面是我如何将相同的模板用于传统呈现和Ajax-response呈现。

模板:

代码语言:javascript
复制
<div  id="sortable">

{% include "admin/app/model/subtemplate.html" %}
</div>

包含的模板(也称为:子模板):

代码语言:javascript
复制
<div id="results_listing">
{% if results %}
    {% for c in results %}
        .....
    {% endfor %}
{% else %}

Ajax-view:

代码语言:javascript
复制
@login_required
@render_to('admin/app/model/subtemplate.html')#annoying-decorator
def ajax_view(request):
    .....

    return { 
        "results":Model.objects.all(),
    }      

当然,您可以使用render_to_response。但我喜欢那些令人讨厌的装饰者:D

票数 13
EN

Stack Overflow用户

发布于 2009-05-19 13:06:40

您没有理由不能使用Ajax返回呈现的HTML片段,并将其插入到现有页面中所需的位置。显然,如果您愿意,您可以使用Django的模板来呈现此HTML。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/882215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档