Domanda

Ho una situazione che richiede il reindirizzamento degli utenti che hanno già effettuato l'accesso dalla pagina di accesso a un'altra pagina. Ho visto menzionare che questo può essere realizzato con decoratori che hanno senso, ma sono abbastanza nuovo nell'usarli. Tuttavia, sto usando il login django e una vista di terze parti (dalla registrazione django). Non voglio modificare nessuno dei codici in django.contrib.auth o django-registration. Come posso applicare un decoratore a una vista che non deve essere modificata per ottenere il comportamento desiderato.

Grazie in anticipo!

AGGIORNAMENTO: ho scoperto di aver erroneamente associato la funzione di accesso al modulo di registrazione. django-registration non ha nulla a che fare con questo problema. Tuttavia, devo ancora essere in grado di sovrascrivere il comportamento predefinito di login (). Qualche pensiero?

È stato utile?

Soluzione

Altri tre modi per farlo, anche se dovrai usare il tuo urlconf per questi:

  1. Aggiungi il decoratore alla vista direttamente in urlconf:

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

    Devi importare la vista e il decoratore in urlconf, motivo per cui non mi piace questo. Preferisco avere il minor numero possibile di importazioni nel mio urls.py.

  2. Importa la vista in un <app>/views.py e aggiungi lì il decoratore:

    import view
    
    view = decorator(view)
    

    Praticamente simile al metodo di Vinay, anche se più esplicito in quanto è necessario un urlconf per esso.

  3. Avvolgi la vista in una nuova vista:

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

    L'ultimo è molto utile quando è necessario modificare le visualizzazioni generiche. Questo è ciò che finisco spesso per fare comunque.

Ogni volta che usi un urlconf, l'ordine dei pattern è importante, quindi potresti aver bisogno di spostarti su quale pattern viene chiamato per primo.

Altri suggerimenti

Se hai la funzione decoratore e sai quale vista nella registrazione django vuoi decorare, puoi semplicemente farlo

registration.view_func = decorator_func(registration.view_func)

dove registration è il modulo nella registrazione django che contiene la funzione di visualizzazione che si desidera decorare, view_func è la funzione di visualizzazione che si desidera decorare e decorator_func è il decoratore .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top