Django — показ разных шаблонов администраторам

Как в Django лучше всего реализовать шаблоны с дополнительными функциями для пользователей с правами администратора.

Я не уверен, следует ли мне создать набор совершенно разных представлений, специально предназначенных для администраторов, или интегрировать его в мои существующие представления и шаблоны, такие как «если пользователь является администратором», везде.

Есть ли стандартный способ сделать это в Django?


person 9-bits    schedule 25.02.2012    source источник


Ответы (3)


Это покажет материал, только если вы активны, а персонал не является администратором:

{% if request.user.is_active and request.user.is_staff %}
    {% include "foo/bar.html" %}
{% endif %}

Если вы хотите показывать только и ТОЛЬКО для администратора, вы должны сделать это:

{% if request.user.is_superuser %}
    ADD your admin stuff there.
{% endif %}

Различия в этих полях здесь< /а>.

person Guillaume    schedule 22.08.2013

Если у вас есть пользователь, доступный в контексте шаблона, вы можете сделать:

{% if user.is_active and user.is_staff %}
    Only the admin will see this code. For example include some admin template here:
   {% include "foo/bar.html" %}
{% endif %}

Пользователь будет доступен в вашем шаблоне, если вы используете RequestContext, а ваша настройка TEMPLATE_CONTEXT_PROCESSORS содержит django.contrib.auth.context_processors.auth, что является значением по умолчанию. См. данные аутентификации в шаблонах в качестве справки.

person Mariusz Jamro    schedule 26.02.2012

Я сторонник сохранения как можно большего количества логики на уровне представления (в целом говоря о шаблоне проектирования MVC). Так почему бы не использовать декораторы, чтобы направлять пользователя к различным представлениям в зависимости от его привилегий? В вашем urls.py определите шаблон для администраторов:

url(r'^admin/$', 'user.views.admin_index'),
#do so for your other admin views, maybe more elegantly than this quick example

Затем определите декоратор, чтобы выгнать пользователя, если он не является администратором.

def redirect_if_not_admin(fn):
def wrapper(request):
    if request.user.is_staff():
        return fn(request)
    #or user.is_superuser(), etc
    else:
        return HttpResponseRedirect('/Permission_Denied/')
return wrapper

И в ваших представлениях администратора

@redirect_if_not_admin
def index(request):
##do your thing 

Это больше кода, чем два других ответа, которые не являются неправильными. Это просто личное предпочтение, чтобы не загромождать представления.

person AndrewSmiley    schedule 26.12.2013