2012-07-12 88 views
2

我在我的Django應用程序中有一個頁面,需要根據登錄用戶相對於一個組的狀態(不是Django用戶組;對我的應用程序定製的東西)在頁面上表示:Django模板 - 有條件地顯示登錄用戶的按鈕

  1. 如果用戶可以加入該組,顯示加入該組的鏈接。
  2. 如果用戶在組中,顯示一個離開組的鏈接。
  3. 如果用戶無法加入該組,則不要顯示任一鏈接。

這樣做的一種方法是創建三個模板(一個帶有連接鏈接,一個帶有離開鏈接,一個沒有鏈接)並在視圖中選擇合適的模板。我覺得有三種不同的模板只會在一行代碼中有所不同,所以我還沒有走過那條路線。

僅僅使用模板顯示條件1和2的正確內容是不可能的,如果是這樣的話,我不認爲這是可取的。用戶到組是多對多的關係,並且確定組成員身份需要將用戶傳遞給組或將用戶組傳遞給用戶。

由於Django模板不允許傳遞函數參數,我試圖通過使用get_context_data將上下文變量傳遞給模板來解決此問題。

def get_context_data(self, **kwargs): 
    context = super(NetworkDetails, self).get_context_data(**kwargs) 
    user = ??? 
    context['in_group'] = user.in_group(context['group_detail']) 
    return context 

如果我這樣做,我怎麼能得到當前登錄的用戶在該方法?如果這是不可能的,我還可以在模板之外獲得哪些信息?有沒有一種可以接受的方法來做這樣的事情?

謝謝!

回答

3

這樣做將創建三個模板(一個與 加入鏈接,一個用假鏈接,一個不帶鏈接),然後選擇 視圖中的一個合適的方法之一

這很有趣,因爲如果你可以選擇要包含的模板,你可以選擇要顯示的html。相反的:

{% if join_link %} 
    {% include 'join_link.html' %} 
{% endif %} 
{% if leave_link %} 
    {% include 'leave_link.html' %} 
{% endif %} 
{% if not join_link and not leave_link %} 
    you can't join 
{% endif %} 

你可以只是:

{% if join_link %} 
    <a href="{{ join_link }}">join</a> 
{% endif %} 
{% if leave_link %} 
    <a href="{{ leave_link }}">leave</a> 
{% endif %} 
{% if not join_link and not leave_link %} 
    you can't join 
{% endif %} 

所以,我不明白爲什麼要使用模板包容。

如果我這樣做,我該如何獲取該方法中當前登錄的用戶?

self.request.user 
self.request.user.is_authenticated() # return True if the user is logged in 
+0

對不起,它可能一直不清楚,但我正在討論的是從views.py中的函數中顯示三個模板中的一個,而不是從模板本身內部完成它。然而'get_context_data'內的'self.request.user'確實是我在找的東西。謝謝! – jonmorgan 2012-07-12 14:46:35

0

可以確定視圖中的狀態和使用上下文傳遞適當的旗(縣)的模板。

如果有多個需要此信息的視圖/模板,則可以實現自定義上下文處理器,該處理器可以在上下文中添加此信息,並在每個模板中都可用。

或者如果您的應用中有任何OneToOne或與User有任何此類關係,則可以在該模型中實施方法。

0

您可以檢查用戶是否通過檢查權限登錄 https://docs.djangoproject.com/en/dev/topics/auth/也可以爲您的其他需求做類似的工作。

+0

請注意,我不問如何確定用戶是否已登錄。 – jonmorgan 2012-07-12 14:43:02

+0

是的,我的意思是制定類似的方法。你可以使用模型,也許就像這樣,我只做了更簡單的模型。 http://tomcoote.co.uk/django/global-django-permissions/, – tamara 2012-07-12 14:47:36