2010-01-27 33 views
3

我有一个django视图,并且这个视图返回一个表格,它是通过ajax调用异步填充的。谁应该格式化我的数据以供显示?

从设计的角度来看,其中一个我应该遵循:

  1. Django的视图,通过AJAX调用,返回表中的作为JSON响应的内容,包含HTML标记为每个小区。 javascript回调处理程序获取内容,并将它们打成表格单元格。
  2. 通过ajax调用的django视图返回有关应该放入表中的纯数据,并再次作为json响应。异步JavaScript回调将获取数据,使用适当的标记对其进行格式化,然后将其放入表中。

换句话说,谁应该对单元格内容的标记格式负责?视图还是javascript?

我会试着说第一个,因为视图已经返回标记的内容。如果它返回包含标记内容的json,则没有太大区别。

我想听听你的观点。

+1

好像你有一个平局: 2:2和一个人未定;-) – Boldewyn 2010-01-27 08:45:08

回答

1

在诸如Django的MVP系统中,View决定应该显示哪些数据,并且Presenter决定如何显示它。因此,JavaScript应该执行大部分格式化操作,除非证明难以实现。

+0

如果模板仍然用于格式化服务器端返回的AJAX数据(事实上,可能是用于最初生成表的相同模板,如某些答案所建议的) ,那么即使返回HTML,ISTM的表示逻辑仍然在正确的位置。在这种情况下,在JS中进行格式化会更困难,更容易出错,速度更慢,而且DRY更少。 – 2010-01-27 15:29:31

1

这是一个很好的练习Unabstrusive的JavaScript,也被一些人称为Hijax

所以,你首先有一个标准的页面,呈现表与页面的其余一起,与表中特定Django模板块。

一旦你有了这个,你可以在“如果不是ajax”中包含django模板的extends部分,所以你只需要在ajax响应中获得所需的表部分,你可以在客户端加载所需的表格部分到所需的div 。

在服务器上维护标记一次,而在客户端维护一次标记,这在javascript中是没有必要和多余的。

因此,我更喜欢服务器重写的第一个选项,而客户端只加载呈现的html。

3

如果您正在填充整个表格,则可以将表格放在其自己的模板中,并通过ajax/json返回表格的html。

你需要编辑原始模板中包含的表模板:

{% include "myapp/_table.html" %} 

并在视图,返回渲染模板作为JSON变量,你的JavaScript将在替补:

return { 'table': render_to_string("myapp/_table.html", context) } 

这种方法非常好,您总是希望更新整个表格,并且表格的渲染不需要完整的上下文。我不确定性能如何,但它是更新页面部分的一种干净方式,因为您只需定义一次表格。

+0

这不完全可能。我逐渐更新表格,说实话。 – 2010-01-27 16:23:20

+0

嗯,我想这取决于你在说多少标记。我更喜欢在将数据发送给用户之前将其格式化,但这取决于您正在进行的格式化。我认为这个普遍的问题不能也不应该用单一的答案来回答。 我的'django-adjax'应用程序中的方法是将数据格式化为模型。要么按原样提供值,要么提供正确值的方法被引用。这对我来说已经足够了,但我不必处理你的具体要求:-) – 2010-01-28 08:51:52

1

我以前遇到过这几次,我通常选择后者,视图返回纯JSON。

但是,您选择的方法肯定要取决于几个因素,其中之一是目标设备(及其CPU /网络限制)。纯JSON通常会导致更小的有效负载,因此可能对移动设备而言是最佳的。

同时公开您的内容的HTML和JSON版本也是有意义的。如果您希望为您的网站创建一个非常轻量级的API,这特别有用。

最后,您可以使用库如John Resig的micro-templatingClosure Templates来简化客户端HTML生成。

2

它取决于(经常)。

如果要求只有在这里,现在的数据,这将是更容易,更容易出错就让它呈现在服务器端用同一套模板已经呈现的标准视图。

但是,如果您可以考虑使用情况,那么在其他地方(如自动完成字段)需要数据的情况下,最好让JavaScript执行此操作并创建干净且可重用的JSON导出。

这些选项添加到所有其他答案,最后由您来决定。

0

我会去的第一选择,正弦波它为用户的更多优点:立即载入网页(不等待异步调用),无需(例如,用于移动设备)JS