在我正在处理的一些代码中,作者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')
......但似乎应该有更好的方法。
有什么想法吗?
答案 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'))
。但这只是目前的单个对象,而不是查询集。不过,这是一个好主意,我可能会很快实现它。
答案 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模板系统将使用这些。