【问题标题】:What's a good way to format AJAX responses? Or, using Django templating with AJAX格式化 AJAX 响应的好方法是什么?或者,使用带有 AJAX 的 Django 模板
【发布时间】:2010-05-06 18:41:09
【问题描述】:

在我正在处理的一些代码中,作者 max AJAX 调用了一个返回 JSON 的 Django 视图。

一旦 JSON 被检索到,它将被注入到页面中,并带有如下所示的函数(注意,这是一个简化,但我相信你知道我在这里得到什么):

function build_event_listing(events) {
    var html = '';

    for(int i = 0; i < events.length; i++) {
        event = events[i];

        html += "<h2>" + event.title + "</h2>\n";
        html += "<p>" + event.description + "</p>";
        html += "Click <a href='/event/view/" + event.id + "'>here<a> for more info.";

    }

    events_div.html(html);
}

我真的不喜欢这种方法。要改变每个事件列表的外观,设计者必须修改那个丑陋的 JS。我更喜欢使用 Django 的模板系统,但我想知道我该怎么做?

我有这样写视图的想法:

def view_listings(req):
    events = models.Event.objects.all()

    html = []
    for event in events:
        html.append(
            render_to_string('event/single_event.html', {
                'event': event,
            }, context_instance=RequestContext(req))

    return HttpResponse(''.join(html), mimetype='text/html')

...但似乎应该有更好的方法。

有什么想法吗?

【问题讨论】:

  • 不确定它是否有效,但你可以使用“包含”吗?假设您仍然需要 ajax 调用。

标签: javascript django


【解决方案1】:

我为您编写了一个 Django/Ajax 库来组织它。你这样写你的模板:

{% load ajax %}
{% adjax_include "event/_event_list.html" %}

在你看来,你会做这样的事情:

import adjax

@adjax_response
def view_listings(req):
    events = models.Event.objects.all()
    adjax.render_to_response("event/_event_list.html", {'events': events})

还有一个模板标签标记单个值以供替换,例如{% adjax event.title %},然后在视图中adjax.update(request, event, ('title', 'description', 'id')) 。但这目前只是单个对象,而不是查询集。不过这是个好主意,我可能会很快实现它。

http://adjax.hardysoftware.com.au/how/

【讨论】:

    【解决方案2】:

    Ajax 调用可以很容易地返回呈现的 HTML,您的 Javascript 可以简单地将其注入页面。所以使用诱人的系统来渲染那个 HTML 片段,然后将它返回给你的 JS。

    【讨论】:

    • 如果你需要用一个 ajax 查询返回的数据填充两个 div 怎么办?进行两次 ajax 调用和两次数据库命中?似乎有点浪费。
    【解决方案3】:

    看看jquery-haml 项目。它使用了非常漂亮、紧凑的Haml 的变体,专为像您这样的情况而设计。

    【讨论】:

      【解决方案4】:

      为什么不使用 django 模板语言的 for 循环功能?

      {% for event in events %}
      ...
      {% endfor %}
      

      你通过以下方式调用它:

      render_to_string('event/events_template.html', {'events':events}, context_instance=RequestContext(req)
      

      【讨论】:

      • 这不是重点。只是我,不想用 javascript 构建 HTML,但仍想通过 AJAX 调用返回 JSON。
      【解决方案5】:

      我可以使用修改版的 tempest:http://plugins.jquery.com/project/tempest

      修改为使用 [[ ]] 和 [% %],而不是 {{ }} 和 {% %},因为 django 模板系统会消耗这些。

      【讨论】:

        猜你喜欢
        • 2017-03-01
        • 2015-06-23
        • 1970-01-01
        • 1970-01-01
        • 2015-12-23
        • 2011-03-25
        • 1970-01-01
        • 2020-07-23
        • 1970-01-01
        相关资源
        最近更新 更多