它被认为是正确的吗?在向ajax POST请求返回部分模板时是否有任何陷阱?例如:
if request.is_ajax: # response is just the form return render(request, 'contact/fields.html', {'form':form})
4urapxun1#
最典型的方法是返回JSON,然后从JSON数据构造客户端所需的任何HTML。然而,可能有人认为这是将表示与行为混合在一起,最好将HTML清楚地分离出来。另一方面,返回一个HTML块是“RESTful”的南辕北辙。在纯粹的REST哲学中,视图应该返回一个标准的、可重用的容器(如JSON或XML)中的数据。稍后,如果你需要将表单拉到iOS/Android/WP7等应用程序环境中,而不是拉到网页中,JSON/XML将同样适用,而HTML实际上是无用的。我可以很容易地看到这两个论点,我不认为一个一定比另一个更正确。最终,我认为你只需要做什么对你的应用最有效,什么对你来说是“感觉正确的”。考虑一下什么对你的特定环境更具可维护性和可扩展性。
xdnvmnnf2#
我还没有在表单POST请求中尝试过这种方法,但是非常类似地,我们将部分HTML返回到AJAX GET请求,以在不加载整个页面的情况下进行页面更改。我认为它也适用于表单请求(事实上,我们目前正在讨论是否在具有多个不同表单的页面上使用这种方法)。我认为如果做得好,这是一个不错的设计模式。我们通过改变哪个基本模板是基于它是否是一个AJAX调用扩展来实现这一点。一个简单的例子:
### view base_template = "base.html" if request.is_ajax(): base_template = "base-ajax.html" return render_to_response(request, 'page.html', {'base_template': base_template}) ### page.html {% extends base_template %} {% block main %}new page content{% endblock %} ### base.html <html> <!-- complete html page --> ... {% block main %}this is what changes per page{% endblock %} ... </html> ### base-ajax.html {% block main %}this is what changes per page{% endblock %}
6ju8rftf3#
我认为我的大多数ajax返回响应返回DOM元素,而不是整个表单。(an示例)
... person = ''' <a href="/person/{0}" class="normalMenu">{1} {2}</a>'''.format(p.id, p.first_name, p.last_name) q = simplejson.dumps({"person":person}) return HttpResponse(q, mimetype="application/json")
上面的代码将一个简单的DOM元素发送回模板,并将其插入到底部的表中,从右向左滑动。如果你把整个模板发回去,整个屏幕会 Flink ,不会得到任何光滑的动画。这是我的理解反正。
zvms9eto4#
我已经为几个jQuery对话框做了这个。对话框内容是由 AJAX 请求请求的,内容在服务器端呈现,然后返回和显示。到目前为止,我没有遇到任何问题。
5fjcxozz5#
从我个人的经验来看,我可以说没有陷阱。我只是没有很好的设计模式(不是很好的实践)。我曾经在相当高负荷的项目中这样做。
dtcbnfnu6#
我在2023年也遇到过同样的问题(2012年有人问过这个问题). Django仍然不支持在不调用整个模板继承链的情况下渲染模板.下面是渲染部分模板的基本方法:
from django.template import Context, loader def render_template_to_string(template_name, context=None): template = loader.get_template(template_name).template context_instance = Context(context or {}) with context_instance.bind_template(template): return template.nodelist.render(context_instance)
您的(部分)模板可以简单到:
<ul>my partial list {% for opt in options %} <li>{{ opt }}</li> {% endfor %} </ul>
然后您可以通过以下方式调用它:
from django.http import HttpResponse resp = render_template_to_string( "path/to/partial/html", {"options": range(10)} ) return HttpResponse(resp)
仅供参考,您可能希望添加对某些节点排除、错误处理的支持,或者对传递给render_template_to_string的内容提供更好的灵活性。
render_template_to_string
6条答案
按热度按时间4urapxun1#
最典型的方法是返回JSON,然后从JSON数据构造客户端所需的任何HTML。然而,可能有人认为这是将表示与行为混合在一起,最好将HTML清楚地分离出来。
另一方面,返回一个HTML块是“RESTful”的南辕北辙。在纯粹的REST哲学中,视图应该返回一个标准的、可重用的容器(如JSON或XML)中的数据。稍后,如果你需要将表单拉到iOS/Android/WP7等应用程序环境中,而不是拉到网页中,JSON/XML将同样适用,而HTML实际上是无用的。
我可以很容易地看到这两个论点,我不认为一个一定比另一个更正确。最终,我认为你只需要做什么对你的应用最有效,什么对你来说是“感觉正确的”。考虑一下什么对你的特定环境更具可维护性和可扩展性。
xdnvmnnf2#
我还没有在表单POST请求中尝试过这种方法,但是非常类似地,我们将部分HTML返回到AJAX GET请求,以在不加载整个页面的情况下进行页面更改。我认为它也适用于表单请求(事实上,我们目前正在讨论是否在具有多个不同表单的页面上使用这种方法)。
我认为如果做得好,这是一个不错的设计模式。我们通过改变哪个基本模板是基于它是否是一个AJAX调用扩展来实现这一点。
一个简单的例子:
6ju8rftf3#
我认为我的大多数ajax返回响应返回DOM元素,而不是整个表单。
(an示例)
上面的代码将一个简单的DOM元素发送回模板,并将其插入到底部的表中,从右向左滑动。
如果你把整个模板发回去,整个屏幕会 Flink ,不会得到任何光滑的动画。这是我的理解反正。
zvms9eto4#
我已经为几个jQuery对话框做了这个。对话框内容是由 AJAX 请求请求的,内容在服务器端呈现,然后返回和显示。到目前为止,我没有遇到任何问题。
5fjcxozz5#
从我个人的经验来看,我可以说没有陷阱。我只是没有很好的设计模式(不是很好的实践)。我曾经在相当高负荷的项目中这样做。
dtcbnfnu6#
我在2023年也遇到过同样的问题(2012年有人问过这个问题). Django仍然不支持在不调用整个模板继承链的情况下渲染模板.
下面是渲染部分模板的基本方法:
您的(部分)模板可以简单到:
然后您可以通过以下方式调用它:
仅供参考,您可能希望添加对某些节点排除、错误处理的支持,或者对传递给
render_template_to_string
的内容提供更好的灵活性。