我一直在尝试理解在Django中做Ajax的最佳方式是什么。通过在这里和那里阅读资料,我了解到常见的过程是:
现在,我仍然不明白的是,Django模板与这一切有什么关系?显然,我们根本没有利用模板的力量。理想情况下,我认为传递回一个JSON对象和一个模板名称会更好,这样就可以遍历数据并创建HTML块。但也许我完全错了..。
我发现这个方向的唯一资源是this snippet (769),但我还没有尝试过它。显然,在这种情况下会发生的情况是,所有生成的HTML都是在服务器端创建的,然后传递给客户端。JavaScript-callback函数只需将其显示在正确的位置。
这会导致性能问题吗?如果没有,即使不使用上面的代码片段,为什么不直接在后端使用Python格式化HTML,而不是在前端呢?
非常感谢!
更新:请使用 ,因为它是上面版本的增强版!我发现继承支持以这种方式工作得更好。
发布于 2009-05-19 18:29:25
嘿谢谢vikingosegundo!
我也喜欢使用装饰器:-)。但与此同时,我一直在遵循我上面提到的代码片段所建议的方法。只有一件事,用the snippet n. 942代替,因为它是原始版本的改进版本。下面是它的工作原理:
假设你有一个模板(例如,'subtemplate.html'),它包含一个你可以重用的有用的块:
........
<div id="results">
{% block results %}
{% for el in items %}
<li>{{el|capfirst}}</li>
{% endfor %}
{% endblock %}
</div><br />
........
通过在视图文件中导入上面的代码片段,您可以很容易地引用模板中的任何块。一个很酷的特性是,模板之间的继承关系被考虑在内,所以如果你引用一个包含另一个块的块,等等,一切都应该正常工作。因此,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)
发布于 2009-05-19 16:19:13
下面是我如何将相同的模板用于传统呈现和Ajax-response呈现。
模板:
<div id="sortable">
{% include "admin/app/model/subtemplate.html" %}
</div>
包含的模板(也称为:子模板):
<div id="results_listing">
{% if results %}
{% for c in results %}
.....
{% endfor %}
{% else %}
Ajax-view:
@login_required
@render_to('admin/app/model/subtemplate.html')#annoying-decorator
def ajax_view(request):
.....
return {
"results":Model.objects.all(),
}
当然,您可以使用render_to_response。但我喜欢那些令人讨厌的装饰者:D
发布于 2009-05-19 13:06:40
您没有理由不能使用Ajax返回呈现的HTML片段,并将其插入到现有页面中所需的位置。显然,如果您愿意,您可以使用Django的模板来呈现此HTML。
https://stackoverflow.com/questions/882215
复制相似问题