mag*_*rth 65 python django ajax templates json
我一直在努力理解在Django中做Ajax的最佳方法是什么.通过阅读这里和那里的东西我收集到的常见过程是:
使用一些JavaScript库(例如,jQuery)制定您的Ajax调用,在Django中设置一个捕获调用并将其传递给视图函数的URL模式
在Python视图函数中检索您感兴趣的对象并以JSON格式或类似方式将它们发送回客户端(通过使用内置的序列化程序模块或simplejson)
在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)
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
当你在做Ajax时,我认为你对模板没有任何用处.模板就在那里,您可以轻松地在服务器端生成动态HTML,因此它在HTML中提供了很少的编程钩子.
在Ajax的情况下,您传递的是JSON数据,您可以在Python中根据需要对其进行格式化.客户端使用JSON通过某些JavaScript库生成HTML /文档元素,例如客户端的jQuery.
也许如果你有一个非常具体的例子,从服务器端HTML替换一些内部HTML,那么也许你可以使用模板,但在这种情况下你为什么需要JSON?您可以通过Ajax查询HTML页面并更改内部或外部或任何HTML.