Переопределение Django с декораторами - PullRequest
1 голос
/ 30 октября 2009

У меня есть ситуация, которая требует перенаправления пользователей, которые уже вошли в систему, со страницы входа на другую страницу. Я видел упоминание, что это может быть достигнуто с помощью декораторов, что имеет смысл, но я довольно новичок в их использовании. Однако я использую логин django и стороннее представление (из django-registration). Я не хочу менять код в django.contrib.auth или django-registration. Как я могу применить декоратор к представлению, которое не должно быть изменено, чтобы получить желаемое поведение.

Заранее спасибо!

ОБНОВЛЕНИЕ: я обнаружил, что я ошибочно связал функцию входа в систему с модулем регистрации. Django-регистрация не имеет ничего общего с этой проблемой. Тем не менее, мне все еще нужно иметь возможность переопределить поведение по умолчанию login (). Есть мысли?

Ответы [ 2 ]

6 голосов
/ 30 октября 2009

Еще три способа сделать это, хотя для этих целей вам понадобится ваш собственный urlconf:

  1. Добавьте декоратор к представлению непосредственно в urlconf:

    ...
    (regexp, decorator(view)),
    ...
    

    Вам необходимо импортировать представление и декоратор в urlconf, поэтому мне это не нравится. Я предпочитаю иметь как можно меньше импорта в моих urls.py.

  2. Импортируйте представление в <app>/views.py и добавьте туда декоратор:

    import view
    
    view = decorator(view)
    

    Очень похоже на метод Винай, хотя и более явный, так как для него нужен urlconf.

  3. Обернуть вид в новом виде:

    import view
    
    @decorator
    def wrapperview(request, *args, **kwargs):
        ... other stuff ...
        return view(request, *args, **kwargs)
    

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

Всякий раз, когда вы используете urlconf, порядок шаблонов имеет значение, поэтому вам может потребоваться перебрать, какой шаблон вызывается первым.

2 голосов
/ 30 октября 2009

Если у вас есть функция декоратора, и вы знаете, какой вид в django-регистрации вы хотите украсить, вы можете просто сделать

registration.view_func = decorator_func(registration.view_func)

, где registration - это модуль в django-регистрации, который содержит функцию просмотра, которую вы хотите декорировать, view_func - это функция просмотра, которую вы хотите декорировать, а decorator_func - декоратор.

...