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

我一直在试图了解在Django中执行Ajax的最佳方法是什么。 通过阅读我在这里和那里的东西,我收集到的常见过程是:

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

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

  3. 在JavaScript中定义一个callback函数,接收JSON数据并parsing它们,从而创build需要显示的任何HTML。 最后,JavaScript脚本将HTML留在应该保留的地方。

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

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

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

非常感谢!

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

嘿谢谢vikingosegundo!

我也喜欢使用装饰:-)。 但在此期间,我一直在按照上面提到的片段中提出的方法。 唯一的事情,用代替片段n。 942导致它是原来的改进版本。 这是如何工作的:

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

........ <div id="results"> {% block results %} {% for el in items %} <li>{{el|capfirst}}</li> {% endfor %} {% endblock %} </div><br /> ........ 

通过在您的视图文件中导入上面的代码片段,您可以轻松地引用模板中的任何块。 一个很酷的function是模板之间的inheritance关系被考虑到了,所以如果你引用一个包含另一个块的块等,一切都应该工作得很好。 所以,ajax视图看起来像这样:

 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) 

以下是我如何使用相同的模板进行传统渲染和Ajax响应渲染。

模板:

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

包含的模板(又名:子模板):

 <div id="results_listing"> {% if results %} {% for c in results %} ..... {% endfor %} {% else %} 

Ajax视图:

 @login_required @render_to('admin/app/model/subtemplate.html')#annoying-decorator def ajax_view(request): ..... return { "results":Model.objects.all(), } 

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

没有理由不能使用Ajax返回呈现的HTML,并将其插入现有页面。 如果你愿意的话,显然你可以使用Django的模板来渲染这个HTML。

当你在做Ajax时,我不认为你对模板有任何用处。 模板是在那里,所以你可以轻松地在服务器端生成dynamicHTML,因此它提供了HTML内的几个编程钩子。

在Ajax的情况下,你传递的是JSON数据,你可以按照你的需要在Python中进行格式化。 和HTML /文档元素将在客户端使用JSON由一些JavaScript库(例如客户端的jQuery)生成。

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

模板是为了演示的目的。 以格式X(JSON, JSONP ,XML, YAML ,* ml等)的数据响应不是演示文稿,因此您不需要模板。 只需要将数据序列化为X格式,然后通过HttpResponse返回。

虽然模板确实只是为了演示目的,但是如果您在服务器端或客户端进行模板,则无关紧要。 这一切都归结为执行一个行动的控制逻辑,从负责创build标记的视图逻辑。 如果您的javascript控制逻辑不得不处理如何渲染或显示HTML,那么您可能会做错了,但是如果将渲染逻辑隔离到另一个对象或函数,并将渲染所需的数据传递给另一个对象或函数,那么你应该没事的; 它反映了我们如何在服务器端分离我们的控制器,模型和视图。

看看github项目: http : //github.com/comolongo/Yz-Javascript-Django-Template-Compiler

它将django模板编译为优化的javascript函数,这些函数将生成您传递的数据的演示文稿html。 编译的函数是纯JavaScript的,所以没有其他库的依赖关系。 由于模板是编译的,而不是在运行时被parsing,所以string和variables都已经被放置到只需要连接的JavaScriptstring中,所以与需要做dom操作或脚本parsing的技术相比,得到最后的介绍。 现在只有基本的标签和filter在那里,但是对于大多数事情来说应该是足够的了,当人们开始向他们请求或者开始贡献给项目时,会添加更多的标签。

您可以使用jquery.load()或类似的方法,在服务器上生成HTML并使用JavaScript将其加载到DOM中。 我想有人称这个AJAH

不幸的是,Django模板只能在服务器端执行。 至less有一个项目使用JavaScript 呈现 Django模板,但我没有使用它,所以我不知道有多快,得到很好的支持或最新的。 除此之外,您必须在服务器上使用Django模板,或在客户端上生成dynamic元素,而不使用模板。