假设您有一个名为“查看故事”的视图,它只是一个通过Python/Django在后端呈现的网页。在该页面上,底部有一个注释列表,作为“查看故事”模板的一部分,使用Django的模板系统(在循环中)。此页面还允许您向列表中添加注释。这是通过AJAX完成的,页面用新的注释更新(不发送新的完整页面请求)。
现在,当将新注释添加到列表末尾时,我希望为这个新注释生成的HTML (在<li>
中的一些内容)使用完全相同的代码,用于生成通过原始请求发送给客户机的原始注释。
有多种方法可以做到这一点:
因此,总之,我想要一种避免复制单个视图的模板/HTML代码的方法。我想要一些关于什么对其他人有效的建议,因为我很确定这是一个普通的案例,不管后端的技术如何。
谢谢!
发布于 2009-11-11 23:24:52
我认为备选方案2是最好的。它是增量的(只在添加注释时再呈现一个注释),并重新使用呈现。如果您不喜欢只从Ajax请求返回HTML,那么让响应是一个JSON结构,其中只包含HTML作为一个组件。然后,您也可以携带状态(或其他任何东西),而不需要额外的请求来获取HTML。
选项1是浪费的:服务器应该呈现页面,因为它应该首先出现。
选项3也是浪费的:为什么要提出两个请求来添加一个评论呢?
发布于 2009-11-12 06:54:28
以下是你应该做的事情:
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})
因此,在将ajax查询提交到add_comment视图后,您将得到评论的内容(一条评论)..然后把它推到清单上..。f.e.像这样使用jQuery:
$('ul#comments').append('<li>'+comment_content+'</li>')
发布于 2010-06-18 05:24:52
还有备选方案4:
复制列表中的现有元素并更改其值。当然,这比模板更不灵活。您可以复制一个隐藏元素,以处理列表为空的情况。
您还可以尝试选项2b:
像选项2一样在服务器上生成HTML,但不是直接访问数据库,而是传递生成例程JSON (或一个很容易转换为JSON的对象)。这涉及到更多的工作,但意味着您在编写自己的网站的同时有效地编写了一个API。
选项1是任何非web应用程序都会使用的。尽管搜索引擎正在改进其处理AJAX的能力,但仍然强烈建议返回HTML中的所有内容。我认为Javascript在所有现代浏览器中都足够快,除了大页面1之外,除了SEO问题之外,其他都是相当合理的。
还有选项5--在服务器上使用Javascript生成页面,并在客户机上使用相同的代码。这可能是最复杂的方法,我不会推荐它,除非你真的有一个很好的理由。
https://stackoverflow.com/questions/1718784
复制相似问题