2011-01-14 82 views
0

我打算創建一個帶變化元素的邊欄(取決於當前的URL和身份驗證狀態)。如何用Django實現動態邊欄?

例如:默認側邊欄顯示登錄和標籤雲。

  • 如果用戶已經登錄,我想顯示一個用戶菜單。
  • 如果當前網址是/tagcloud,我想將其隱藏在邊欄中。

其實,我需要一種方法使我做在一個視圖中是這樣的:

def some_view(request): 
    if request.user.is_authenticated(): 
     sidebar.remove('login') 
     sidebar.add('user_menu') 

def tag_cloud(request): 
    sidebar.remove('tag_cloud') 

之後,我想通過sidebar(含蓄,沒有把它傳遞給render_to_response)到模板,我想要做這樣的事情:

<div id="sidebar"> 
    {{ sidebar }} 
</div> 

這可能嗎?

回答

5

你最好做一個context_processors.py文件
這也意味着你必須use a RequestContext when returning your views

def include_tagcloud(request): 
    if request.path == '/tagcould/': 
     tagcloud = Tags.objects.filter(active=True) #whatever 
    return {'tagcloud': tagcloud} 

def include_login(request): 
    if request.user.is_authenticated(): 
     loginform = MyLoginForm(request.POST) 
     #passing a Django form + POST data in the case of re-submit 
    return {'loginform' : loginform} 

,然後在模板:

{% if loginform %} 
     <form action="accounts/login/"> 
     {{form.as_p}} 
     <input type="submit" name="Login"> 
     </form> 
{% endif %} 

{% if tagcloud %} 
     {%for tag in tagcloud %}.....{%for} 
{% endif %} 

在這個例子中登錄形式指向一個固定的視圖,
如果你想趕上每個視圖的登錄表單發佈,我不知道該怎麼辦

編輯:如果你不使用Django的CSRF功能,你可以簡單地插入底座模板登錄表單,而無需使用任何Django的形式和指向登錄視圖:

{% if user.is_authenticated %} 
    <form action="accounts/login/"> 
    <input type="text" name="username"><input type="password" name="password"> 
    <input type="submit" name="Login"> 
    </form> 
{% endif %} 
+0

非常感謝!這是我一直在尋找的解決方案。根據文檔(http://docs.djangoproject.com/en/dev/ref/templates/api/#writing-your-own-context-processors),上下文處理器必須返回一個字典 - 並且它工作正常。謝謝。 – Nedec 2011-01-14 17:07:20

+1

您也可以將側邊欄粘貼在單獨的模板中,並將其包含在內。使其易於重複使用。 – 2011-01-15 08:15:35

0

是的,但你可以使用模板的繼承和組合。然後將您的側邊欄包含在從所有模板中使用/繼承的父模板中。然後很容易找到側邊欄的模板:它在一個單獨的文件中。