EDIT: (см. Конец поста для исходного текста ответа с исходной, простой идеей)
После любезно пострадавшего с cluebat (см комментарий Ора в ниже), я нахожу, может видеть больше проблемы, чем раньше. Извините, так долго. Во всяком случае:
Будет ли этот шаблон подходящим для вас?
{% for mi in dyn_menu_items %}
{% if mi.authorised %}
<a href={{ mi.url }}>{{ mi.title }}</a>
{% endif %}
{% endfor %}
Чтобы сделать эту работу на стороне Python, вы можете использовать RequestContext
в ваших взглядах с пользовательской настройки контекста переменной dyn_menu_items
соответствующим процессором. В этом случае требуется некоторая справочная информация, то 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
сниппает делает то, что вы хотите, просто не DRY-LY достаточно, как насчет прокатки своей собственной обертки:
def ask_to_login(perm, view):
return permission_required(perm, login_url='/loginpage/', view)
вы можете поместить это в любом месте, в том числе в привязках.Затем вы можете заменить все упоминания '/loginpage/'
ссылкой на переменную, определенную в верхней части вашего файла URL-адресов, и у вас будет решение с единственным упоминанием фактического URL-адреса входа, для одноразового обновления указанного URL-адреса следует вам нужно переместить его. :-)
Конечно, взгляды все равно должны быть обернуты явно; если это вас беспокоит, вы можете попытаться сделать ask_to_login
в декоратор для удобства упаковки на сайте определения. (Но, возможно, лучше не делать этого, чтобы вы не заставили себя выкопать свои взгляды из-под декоратора, если они вам понадобятся в какой-то момент в будущем.)
Спасибо, но я искал что-то «сушилку», как http://code.google.com/p/greatlemers-django-tools/, но я не знаю, если проект все еще активен. – jbochi
Да, я могу понять, что вы имеете в виду сейчас ... Я отредактировал свой ответ, чтобы включить эскиз возможного решения, интересно, может ли это использовать вас? –