假设您有一个名为“View Story”的视图,它只是通过Python / Django在后端呈现的网页。在该页面上,使用Django的模板系统(在循环中)作为“View Story”模板的一部分呈现在底部的注释列表。此页面还允许您向列表添加注释。这是通过AJAX完成的,页面使用新评论进行更新(不发送新的整页请求)。
现在,在将新注释添加到列表末尾时,我希望为此新注释生成的HTML(<li>
内的某些内容)使用与生成原始注释完全相同的代码通过原始请求发送给客户。
有多种方法可以做到这一点:
让初始渲染将注释数据抛出到javascript变量中,一旦页面呈现,就通过javascript添加内容。然后,当添加新注释时,可以使用相同的javascript来呈现新的注释。问题:从搜索引擎的角度来看,我不确定google是否能够在评论页面呈现后生成它们的索引 - 我猜不是
每次通过AJAX添加新评论时,请让ajax请求返回放在页面上的实际HTML,而不仅仅是新评论的JSON数据。可以使用用于呈现原始页面的相同模板片段生成HTML。这个问题是它将AJAX请求与特定视图或我不喜欢的渲染方式联系起来。
与#2类似,不同之处在于单独请求检索新注释的HTML或者可能是所有注释,并且只是擦除并重新呈现列表。不喜欢这样做会导致效率低下且不必要地耗费时间。
因此,总而言之,我想要一种方法来避免为单个视图复制模板/ HTML代码。我想就其他人的工作提出一些建议,因为我很确定这是一个常见的情况,无论后端技术如何。
谢谢!
答案 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生成页面并在客户端上使用相同的代码。这可能是最复杂的方法,除非你有充分的理由,否则我不推荐它。