Django部分模板响应

时间:2012-01-23 21:30:42

标签: django django-templates django-views

它被认为是正确/将部分模板返回到ajax POST请求有任何陷阱吗?

例如:

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

5 个答案:

答案 0 :(得分:2)

最典型的方法是返回JSON,然后从JSON数据构建客户端需要的任何HTML。但是,可以认为这是将表示与行为混合在一起,最好将HTML清楚地分开。

另一方面,返回一个HTML块就像你可以获得的“RESTful”一样极向南。在纯REST哲学中,视图应该在标准和可重用容器(例如JSON或XML)中返回数据。稍后如果您需要将表单拉入iOS / Android / WP7 /等。应用程序环境而不是网页,JSON / XML也会为您提供服务,而HTML实际上是无用的。

我可以很容易地看到这两个论点,我认为不一定比另一个更正确。最终,我认为你必须做对你的应用程序最有效的方法以及对你“感觉正确”的东西。考虑一下对于您的特定情况更具可维护性和可扩展性的内容。

答案 1 :(得分:1)

我还没有尝试使用表单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 %}

答案 2 :(得分:0)

我认为我的大多数ajax返回响应都返回DOM元素,而不是整个表单。

(例子)

...
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元素发送回模板,并将其插入底部的表格中。从右到左滑动。

如果您发回整个模板,整个屏幕将闪烁,并且不会获得任何光滑的动画。无论如何,这是我的理解。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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