Question

J'ai une situation qui nécessite de rediriger les utilisateurs déjà connectés en dehors de la page de connexion vers une autre page. J'ai vu la mention que cela peut être accompli avec des décorateurs, ce qui est logique, mais je suis assez nouveau pour les utiliser. Cependant, j'utilise le login Django et une vue tierce (à partir de Django-registration). Je ne veux pas changer le code dans django.contrib.auth ou django-registration. Comment puis-je appliquer un décorateur à une vue qui ne doit pas être modifiée afin d'obtenir le comportement souhaité.

Merci d'avance!

UPDATE: j'ai découvert que j'avais associé par erreur la fonction de connexion au module d'enregistrement. django-registration n'a rien à voir avec ce problème. Cependant, je dois encore pouvoir redéfinir le comportement par défaut de login (). Des pensées?

Était-ce utile?

La solution

Il existe trois autres moyens de le faire, bien que vous deviez utiliser votre propre urlconf pour ces éléments:

  1. Ajoutez le décorateur à la vue directement dans l'urlconf:

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

    Vous devez importer la vue et le décorateur dans l'urlconf, c'est pourquoi je n'aime pas celle-ci. Je préfère avoir le moins possible d'importations dans mon urls.py.

  2. Importez la vue dans un <app>/views.py et ajoutez-y le décorateur:

    import view
    
    view = decorator(view)
    

    Un peu comme la méthode de Vinay mais plus explicite puisque vous avez besoin d’un urlconf pour cela.

  3. Enveloppez la vue dans une nouvelle vue:

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

    Le dernier est très pratique lorsque vous devez modifier des vues génériques. C’est ce que je finis souvent par faire quand même.

Chaque fois que vous utilisez un urlconf, l'ordre des motifs est important. Vous devrez donc peut-être vous déplacer pour savoir quel motif est appelé en premier.

Autres conseils

Si vous avez la fonction décorateur et que vous savez quelle vue vous souhaitez décorer dans l'enregistrement Django, vous pouvez simplement le faire

registration.view_func = decorator_func(registration.view_func)

registration est le module dans django-registration qui contient la fonction d'affichage que vous souhaitez décorer, view_func est la fonction d'affichage que vous souhaitez décorer et decorator_func le décorateur. .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top