最初渲染页面并使用相同的模板HTML通过AJAX更新

时间:2009-11-11 23:18:28

标签: javascript python ajax django

假设您有一个名为“View Story”的视图,它只是通过Python / Django在后端呈现的网页。在该页面上,使用Django的模板系统(在循环中)作为“View Story”模板的一部分呈现在底部的注释列表。此页面还允许您向列表添加注释。这是通过AJAX完成的,页面使用新评论进行更新(不发送新的整页请求)。

现在,在将新注释添加到列表末尾时,我希望为此新注释生成的HTML(<li>内的某些内容)使用与生成原始注释完全相同的代码通过原始请求发送给客户。

有多种方法可以做到这一点:

  1. 让初始渲染将注释数据抛出到javascript变量中,一旦页面呈现,就通过javascript添加内容。然后,当添加新注释时,可以使用相同的javascript来呈现新的注释。问题:从搜索引擎的角度来看,我不确定google是否能够在评论页面呈现后生成它们的索引 - 我猜不是

  2. 每次通过AJAX添加新评论时,请让ajax请求返回放在页面上的实际HTML,而不仅仅是新评论的JSON数据。可以使用用于呈现原始页面的相同模板片段生成HTML。这个问题是它将AJAX请求与特定视图或我不喜欢的渲染方式联系起来。

  3. 与#2类似,不同之处在于单独请求检索新注释的HTML或者可能是所有注释,并且只是擦除并重新呈现列表。不喜欢这样做会导致效率低下且不必要地耗费时间。

  4. 因此,总而言之,我想要一种方法来避免为单个视图复制模板/ HTML代码。我想就其他人的工作提出一些建议,因为我很确定这是一个常见的情况,无论后端技术如何。

    谢谢!

3 个答案:

答案 0 :(得分:6)

这是你应该做的:

view_story.html:

bla bla bla

Comments:
<ul id="comments">
{% for comment in comments %}
   <li>{% include "comment_item.html" %}</li>
{% endfor %}
</ul>
<from>Ajax form here</form>

比你需要创建添加评论的视图(ajax):

def add_comment(request):
    comment = Comment(...)
    return render_to_response('comment_item.html', {'comment': comment})

因此,在向ad_comment视图提交ajax查询后,您将获得评论的内容(一条评论)..之后只需将其推送到列表.. f.e.像这样使用jQuery:

$('ul#comments').append('<li>'+comment_content+'</li>')

答案 1 :(得分:3)

我认为选项2是最好的。它是增量的(仅在添加注释时再渲染一条注释),并重新使用渲染。如果您不喜欢仅从Ajax请求返回HTML,那么将响应设置为JSON结构,其中HTML仅包含一个组件。然后你也可以携带状态(或其他),而无需额外的请求来获取HTML。

选项1是浪费的:服务器应该首先显示页面。

选项3也是浪费:为什么要提出两个添加单个评论的请求?

答案 2 :(得分:1)

还有选项4:

复制列表中的现有元素并更改其值。这当然不如模板灵活。您可以复制隐藏元素,以处理列表为空的情况。

您也可以尝试选项2b:

在服务器上生成HTML,如选项2,但不是直接访问数据库,而是将生成例程传递给JSON(或者可以轻松转换为JSON的对象)。这涉及更多工作,但意味着您在编写自己的网站的同时有效地编写API。

选项1是任何非Web应用程序将使用的。尽管搜索引擎在处理AJAX方面的能力正在提高,但仍然强烈建议以HTML格式返回所有内容。我认为Javascript在所有现代浏览器中都足够快,除了巨大的页面1之外,除了搜索引擎优化问题之外,它是非常合理的。

还有选项5 - 在服务器上使用Javascript生成页面并在客户端上使用相同的代码。这可能是最复杂的方法,除非你有充分的理由,否则我不推荐它。