Контекстный процессор Django для проверки прав пользователя - PullRequest
0 голосов
/ 30 декабря 2011

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

Как мне прочитать существующий контекст из контекстного процессора?

Edit: Причина использования этого типа контекстного процессора состоит в том, чтобы не иметь разрешения проверки с операторами if в каждом представлении. Некоторые пользователи будут иметь доступ для чтения / записи, другие будут иметь доступ только для чтения, а другие не будут иметь доступа на уровне объекта. Я хотел бы соответствующим образом манипулировать формой после обработки представления.

Ответы [ 2 ]

4 голосов
/ 30 декабря 2011

Почему бы просто не обернуть вид декоратором user_passes_test?Там вы можете запускать любые проверки, которые вам нравятся - хаки не требуются.

1 голос
/ 30 декабря 2011

Вы должны использовать django-полномочий или любой пакет полномочий . Хотя я не могу гарантировать, что они не полагаются на хаки сами по себе, но, по крайней мере, вы не будете одни, используя хаки. Тем не менее, вот рабочее решение вашей проблемы:

  1. Патч обезьяны django.template.base.RequestContext , для установки request.context = self.

  2. Создайте процессор контекста шаблона , который может использовать request.context

  3. Добавьте процессор контекста в настройки , и все готово

Вот пример, который вы можете просто вставить в settings.py, он работает:

def print_context(request):
    print request.context.get('form', 'No form in this context')
    return {}

from django.template.base import RequestContext
orig_init = RequestContext.__init__
def new_init(self, request, **kwargs):                                           
    request.context = self
    orig_init(self, request, **kwargs)                                           
RequestContext.__init__ = new_init

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.auth',                                       
    'django.core.context_processors.debug',
    'django.core.context_processors.i18n',                                       
    'django.core.context_processors.media',
    'django.core.context_processors.request',
    'settings.print_context',
)

Обратите внимание, что вы работаете против дизайна Django , я опубликовал этот ответ, предполагая, что вы знаете, что делаете - вы хорошо знаете и Python, и Django.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...