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

mag*_*rth 65 python django ajax templates json

我一直在努力理解在Django中Ajax的最佳方法是什么.通过阅读这里和那里的东西我收集到的常见过程是:

  1. 使用一些JavaScript库(例如,jQuery)制定您的Ajax调用,在Django中设置一个捕获调用并将其传递给视图函数的URL模式

  2. Python视图函数中检索您感兴趣的对象并以JSON格式或类似方式将它们发送回客户端(通过使用内置的序列化程序模块或simplejson)

  3. 在JavaScript中定义一个回调函数,接收JSON数据并解析它们,以便创建需要显示的任何HTML.最后,JavaScript脚本将HTML放在任何位置.

现在,我仍然没有得到的是Django模板如何与所有这些相关?显然,我们根本没有充分利用模板的力量.理想情况下,我认为传回JSON对象和模板名称会很好,这样可以迭代数据并创建HTML块.但也许我在这里完全错了......

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

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

非常感谢!

更新:请使用片段942,因为它是上面的增强版!我发现继承支持这种方式效果更好..

mag*_*rth 25

嘿谢谢vikingosegundo!

我也喜欢使用装饰器:-).但与此同时,我一直在关注上面提到的片段所建议的方法.唯一的事情,使用代码片段n.942因为它是原版的改进版本.以下是它的工作原理:

想象一下,你有一个模板(例如,'subtemplate.html'),其大小包含一个你可以重复使用的有用块:

     ........
    <div id="results">          
        {% block results %}
            {% for el in items %}
                   <li>{{el|capfirst}}</li>
            {% endfor %}
        {% endblock %}      
    </div><br />
     ........
Run Code Online (Sandbox Code Playgroud)

通过在视图文件中导入上面的代码段,您可以轻松引用模板中的任何块.一个很酷的特性是模板之间的继承关系被考虑在内,所以如果你引用一个包含另一个块的块等等,一切都应该正常工作.所以,ajax-view看起来像这样:

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)
Run Code Online (Sandbox Code Playgroud)

  • 我知道我迟到了2岁,但这是在Django中做AJAX的正确方法吗? (7认同)
  • @zengr是的,这仍然是这样做的正确方法.尽管最初的评论是在一年多以前,但我发布此回复是为了引用其他人. (5认同)

Vik*_*ica 13

以下是我使用相同模板进行传统渲染和Ajax响应渲染的方法.

模板:

<div  id="sortable">

{% include "admin/app/model/subtemplate.html" %}
</div>
Run Code Online (Sandbox Code Playgroud)

包含的模板(aka:subtemplate):

<div id="results_listing">
{% if results %}
    {% for c in results %}
        .....
    {% endfor %}
{% else %}
Run Code Online (Sandbox Code Playgroud)

Ajax视图:

@login_required
@render_to('admin/app/model/subtemplate.html')#annoying-decorator
def ajax_view(request):
    .....

    return { 
        "results":Model.objects.all(),
    }      
Run Code Online (Sandbox Code Playgroud)

当然你可以使用render_to_response.但我喜欢那些讨厌的装饰者:D

  • 很好的例子.您可能需要检查request.is_ajax()以确保您没有尝试从正常请求访问该视图. (2认同)

Dan*_*man 7

没有理由不能使用Ajax返回渲染的HTML,并将其插入到您想要的点的现有页面中.显然,如果需要,您可以使用Django的模板来呈现此HTML.


Anu*_*yal 6

当你在做Ajax时,我认为你对模板没有任何用处.模板就在那里,您可以轻松地在服务器端生成动态HTML,因此它在HTML中提供了很少的编程钩子.

在Ajax的情况下,您传递的是JSON数据,您可以在Python中根据需要对其进行格式化.客户端使用JSON通过某些JavaScript库生成HTML /文档元素,例如客户端的jQuery.

也许如果你有一个非常具体的例子,从服务器端HTML替换一些内部HTML,那么也许你可以使用模板,但在这种情况下你为什么需要JSON?您可以通过Ajax查询HTML页面并更改内部或外部或任何HTML.