編輯:(參見後結束與最初的,簡單的想法的回答原文)
與cluebat(請參見下面的OP的評論)被親切災區後,我發現我可以看到比以前更多的問題。對不起,花了這麼長時間。無論如何:
請問這種模板適合你嗎?
{% for mi in dyn_menu_items %}
{% if mi.authorised %}
<a href={{ mi.url }}>{{ mi.title }}</a>
{% endif %}
{% endfor %}
要在Python端這項工作,你可以用你的看法RequestContext
帶有自定義背景處理器適當設置dyn_menu_items
變量。在情況下,需要一些背景信息,Django的書的Advanced Templates章介紹RequestContext
,顯示瞭如何render_to_response
(還挺重要:-))使用等
另外,我想在這一點上它可能是有用的把負責網站的鎖定了部分視圖功能列表中的某個地方:
_dyn_menu_items = [(url1, view1, title1, perm1), ...]
然後,你可以map
一對夫婦的功能,說prepare_pattern
和prepare_menu_item
跨名單,有它大致的工作就像這樣:
def prepare_pattern(menu_item):
url1, view, title, perm = menu_item
pattern = PREPARE_URLCONF_ENTRY_SOMEHOW(...) # fill in as appropriate
return pattern
def prepare_menu_item(menu_item):
url, view, title, perm = menu_item
mi = PREPARE_THE_BIT_FOR_REQUESTCONTEXT(...) # as above
return mi
這些可以合併成一個單一的功能,當然,但不是每個人都會發現結果更具可讀性......無論如何,map(prepare_menu_item, _dyn_menu_items)
的輸出將需要一個字典,通過有用的信息傳遞給你的意見上下文處理器(找出其中,這是稍微乏味的一點,我會留給你;-)),而輸出map(prepare_pattern, _dyn_menu_items)
,我們稱之爲dyn_menu_patterns
,將用於patterns('', *dyn_menu_patterns)
,用於你的URL配置。
我希望這是有道理的,是有一定的幫助......
預編輯答案:
根據您的簡短說明,我不知道有什麼解決辦法將是最適合你......但如果permission_required
片段你想要做什麼,只是不DRY-LY不夠,如何使用您自己的包裝:
def ask_to_login(perm, view):
return permission_required(perm, login_url='/loginpage/', view)
你可以把這個在任何地方,包括在URL配置。然後,您可以將所有提及的'/loginpage/'
替換爲引用您的URL文件頂部定義的變量,並且您可以爲自己提供一個解決方案,只需提及實際的登錄URL即可,對於所述URL的一次更新你必須移動它。 :-)
當然,視圖仍然需要明確包裝;如果這讓你感到困擾,你可以嘗試將ask_to_login
變成裝飾器,以便在定義站點上輕鬆打包。 (但也許最好不要這樣做,否則你會強迫自己從裝飾者那裏挖掘你的觀點,以防將來在某些時候需要它們未裝飾)。
謝謝,但我一直在尋找一些「機」之類http://code.google.com/p/greatlemers-django-tools/,但我不知道如果項目仍然活躍。 – jbochi 2009-12-20 19:07:20
是的,我現在可以看到你的意思了......我編輯了我的答案,包括一個可能的解決方案的草圖,我想知道這對你有用嗎? – 2009-12-20 22:13:34