Django部分模板响应

kgqe7b3p  于 2023-02-14  发布在  Go
关注(0)|答案(6)|浏览(446)

它被认为是正确的吗?在向ajax POST请求返回部分模板时是否有任何陷阱?
例如:

if request.is_ajax:
    # response is just the form 
    return render(request, 'contact/fields.html', {'form':form})
4urapxun

4urapxun1#

最典型的方法是返回JSON,然后从JSON数据构造客户端所需的任何HTML。然而,可能有人认为这是将表示与行为混合在一起,最好将HTML清楚地分离出来。
另一方面,返回一个HTML块是“RESTful”的南辕北辙。在纯粹的REST哲学中,视图应该返回一个标准的、可重用的容器(如JSON或XML)中的数据。稍后,如果你需要将表单拉到iOS/Android/WP7等应用程序环境中,而不是拉到网页中,JSON/XML将同样适用,而HTML实际上是无用的。
我可以很容易地看到这两个论点,我不认为一个一定比另一个更正确。最终,我认为你只需要做什么对你的应用最有效,什么对你来说是“感觉正确的”。考虑一下什么对你的特定环境更具可维护性和可扩展性。

xdnvmnnf

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 %}
6ju8rftf

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 ,不会得到任何光滑的动画。这是我的理解反正。

zvms9eto

zvms9eto4#

我已经为几个jQuery对话框做了这个。对话框内容是由 AJAX 请求请求的,内容在服务器端呈现,然后返回和显示。到目前为止,我没有遇到任何问题。

5fjcxozz

5fjcxozz5#

从我个人的经验来看,我可以说没有陷阱。我只是没有很好的设计模式(不是很好的实践)。我曾经在相当高负荷的项目中这样做。

dtcbnfnu

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的内容提供更好的灵活性。

相关问题