【问题标题】:Django partial template responsesDjango 部分模板响应
【发布时间】:2012-01-23 21:30:41
【问题描述】:

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

例如:

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

【问题讨论】:

  • 部分是指它只是一些 HTML 吗?没有 doctype 或 标签?
  • 是的,没错。像
    一堆 html

标签: django django-templates django-views


【解决方案1】:

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

另一方面,返回一个 HTML 块大约是“RESTful”的极南端。在纯 REST 哲学中,视图应该在标准且可重用的容器(例如 JSON 或 XML)中返回数据。稍后,如果您需要将表单拉入 iOS/Android/WP7/等。应用程序环境而不是网页,JSON/XML 也可以为您服务,而 HTML 几乎没有用处。

我可以很容易地看到这两个论点,而且我认为其中一个不一定比另一个更正确。归根结底,我认为你只需要做最适合你的应用程序和你“感觉正确”的事情。根据您的特定情况考虑什么更易于维护和扩展。

【讨论】:

  • +1 用于布置另一面,但在 Django 1.4 中,编写客户端测试应该变得司空见惯,这绝对应该通过以通用和 RESTful 方式返回 JSON 数据来处理。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    如果您发回整个模板,整个屏幕都会闪烁,并且不会出现任何流畅的动画。反正这是我的理解。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        根据个人经验,我可以说没有陷阱。我只是不是很好的设计模式(不是很好的做法)。我曾经在负载很高的项目中这样做。

        【讨论】:

          猜你喜欢
          • 2015-04-28
          • 2015-12-23
          • 2012-12-10
          • 2011-09-28
          • 1970-01-01
          • 2021-11-05
          • 1970-01-01
          • 2017-10-12
          • 2020-05-28
          相关资源
          最近更新 更多