Вопрос

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

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

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

Это было полезно?

Решение

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

<Ол>
  • Добавьте декоратор к представлению непосредственно в urlconf:

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

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

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

    import view
    
    view = decorator(view)
    

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

  • Сверните представление в новом представлении.

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

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

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

    Другие советы

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

    registration.view_func = decorator_func(registration.view_func)
    

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top