格式化AJAX响应的好方法是什么?或者,使用Django模板与AJAX

时间:2010-05-06 18:41:09

标签: javascript django

在我正在处理的一些代码中,作者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')

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

有什么想法吗?

5 个答案:

答案 0 :(得分:1)

Ajax调用可以轻松返回呈现的HTML,您的Javascript可以简单地将其注入页面。因此,使用诱人系统渲染该HTML片段,然后将其返回给您的JS。

答案 1 :(得分: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 :(得分:1)

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

答案 3 :(得分:0)

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

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

您可以通过以下方式致电:

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

答案 4 :(得分:0)

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

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