2010-05-06 32 views
1

在我正在處理的一些代碼中,作者max AJAX調用返回JSON的Django視圖。什麼是格式化AJAX響應的好方法?或者,使用Django使用AJAX模板

一旦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

不知道它是否有效,但可以使用「include」嗎?假設你仍然想要ajax調用。 – Dingle 2010-05-06 19:43:56

回答

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/

+0

在該鏈接上獲取錯誤500 ... – synic 2010-05-06 22:57:15

+0

共享主機:-( – 2010-05-06 23:30:27

0

爲什麼不使用django的模板語言的for循環功能?

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

,你通過調用它:

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

這不是重點。這只是我,不想用JavaScript構建HTML,但仍然希望通過AJAX調用返回JSON。 – synic 2010-05-06 20:46:27

1

Ajax調用可以輕鬆地返回呈現的HTML,而您的Javascript可以簡單地將其返回到頁面中。因此,使用誘人的系統來呈現該HTML片段,然後將其返回給您的JS。

+0

如果您需要使用從一個ajax查詢返回的數據填充兩個div,該怎麼辦?做兩個Ajax調用和兩個數據庫匹配?似乎有點浪費。 – synic 2010-05-06 23:10:18

1

看看在jquery-haml項目。它使用非常漂亮,緊湊的Haml上的變體,專門爲您的情況而設計。

相關問題