2013-11-20 45 views
0

我有一個簡單的問題。我在django中有一個功能齊全的網站,它有一個標題,菜單和頁腳,永不改變,內容也會發生變化。我簡單的模板看起來像這樣:
base.html文件在django中修改視圖以處理ajax請求

<html> 
    ...header... 
    <body> 
    ...menu... 
    {%block content%}{%endblock%} 
    ...footer... 
    </body> 
</html> 

和content.html

{%extends 'base.html'%} 
{%block content%}...content according to selected menu item...{%endblock%} 

這一點,一切工作正常。 現在我決定,對於已啓用javascript的用戶,我可以添加ajax調用,因此無論何時點擊上級菜單項(將有onClick),只有「content」塊被升級。我的問題是:我可以重複使用我的原始以某種方式查看和修改它以適應兩種需求 - 常規調用和ajax調用?或者我應該以某種方式重新設計我的模板?還是我需要爲每個單獨的視圖?
我的簡化圖的樣子:

def main(request,site): 
    ...some site processing... 
    return render_to_response('content.html',{'content':...site content...}) 

謝謝

回答

0

我認爲在jquery.load()方法中使用url參數的方便功能要比使用django模板和視圖更容易。所述jquery docs賽斯

的​​方法[...]允許我們指定的 一部分遠程文檔插入。這是通過url參數的特殊 語法實現的。如果字符串中包含一個或多個空格字符 ,則假定第一個 空間後面的字符串部分是用於確定要加載的內容 的jQuery選擇器。

在JavaScript事件處理程序,只要簡單的寫是這樣的:

$('.content').load('/otherPage.html .content'); 

這就是全部。

+0

這很有趣,謝謝,我會試試看。 – MartinM

+1

我是會接受這個答案,因爲它會讓我找到最終的解決方案。基本的想法是,如果你想在你的django應用中使用ajax,並且不必爲它輸入很多額外的代碼,那就是以不同的方式考慮模板。您不應該擴展模板,而應該包含您希望以後通過Ajax更新的模塊。如果請求是常規的,那麼你只需渲染基礎(或者任何擴展基礎),如果Ajax只渲染片段,然後將其放置在應該出現的位置 - 很棒的是 - 你可以在一個視圖中進行。檢查[this](http://www.micahcarrick.com/ajax-form-submission-django.html) – MartinM

0

您可以檢查您的視圖Ajax調用,並給予相應的響應:

if request.is_ajax(): 
    #do something 

看看這裏:https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.is_ajax

希望這導致正確的方向。

+0

謝謝,我意識到這一點,但在這一點上,我只需要呈現content.html沒有base.html,我真的不知道如何做到這一點,沒有「擴展」標記的內容重複模板代碼 – MartinM

+0

大多數情況下,您只需以JSON格式返回一些「值」,並通過JavaScript將其插入到您的網站中即可。 – Jingo

+0

返回html是不好的原則? – MartinM