РЕДАКТИРОВАТЬ: (исходный текст ответа с первоначальной, простой идеей см. В конце поста).
После того, как вы были любезно поражены подсказкой (см. Комментарий ОП ниже), Я вижу, я вижу больше проблемы, чем раньше.Извините, что так долго.В любом случае:
Подойдет ли вам этот тип шаблона?
{% for mi in dyn_menu_items %}
{% if mi.authorised %}
<a href={{ mi.url }}>{{ mi.title }}</a>
{% endif %}
{% endfor %}
Чтобы это работало на стороне Python, вы могли бы использовать RequestContext
в своих представлениях с помощью обработчика пользовательских контекстовустановка переменной dyn_menu_items
соответствующим образом.Если требуется некоторая справочная информация, глава Расширенные шаблоны Книги Джанго представляет 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
делает то, чтоВы хотите, но не достаточно СУХОЙ, как насчет того, чтобы свернуть свою собственную обертку:
def ask_to_login(perm, view):
return permission_required(perm, login_url='/loginpage/', view)
Вы можете поместить это куда угодно, включая URLconf.Тогда вы могли бы заменить все упоминания '/loginpage/'
ссылкой на переменную, определенную в верхней части файла URL-адресов, и у вас было бы решение с одним упоминанием фактического URL-адреса для входа в систему, для обновления только одного из них.URL, если вы должны переместить его.: -)
Конечно, представления по-прежнему необходимо явно переносить;если это вас беспокоит, вы можете попытаться превратить ask_to_login
в декоратор для удобного переноса на сайт определения.(Но, возможно, действительно лучше этого не делать, иначе вы заставите себя копать свои взгляды из-под декоратора на случай, если они понадобятся в будущем без отделки.)