编辑:(请参阅帖子末尾的原始答案,其中包含最初的简单想法。)
在受到线索蝙蝠的善意打击后(请参阅下面的 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 Book 的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) , 在你的 URLconf 中使用。
我希望这是有道理的,并能有所帮助......
预编辑答案:
根据您的简短描述,我不确定哪种解决方案最适合您...但是,如果 permission_required sn-p 可以满足您的需求,只是不够干,那么您自己滚动如何包装:
def ask_to_login(perm, view):
return permission_required(perm, login_url='/loginpage/', view)
你可以把它放在任何地方,包括在 URLconf 中。然后,您可以参考在 URL 文件顶部定义的变量替换所有提及 '/loginpage/' 的内容,并且您将获得一个解决方案,只需提及实际登录 URL,仅在一处更新所述URL 如果你必须移动它。 :-)
当然,视图仍然需要显式包装;如果这让您感到困扰,您可以尝试将ask_to_login 制作成装饰器,以便在定义站点上轻松包装。 (但也许最好不要这样做,以免你强迫自己从装饰器下面挖掘你的观点,以防你将来需要它们不装饰。)