web-dev-qa-db-fra.com

Pourquoi la deuxième connexion utilisateur me redirige vers / accounts / profile / url?

J'utilise Django vue intégrée pour la connexion utilisateur:

url(r'^user/login/$', 'Django.contrib.auth.views.login', {'template_name': 'users/templates/login.html'}, name='user-login'),

Après la connexion lorsque je suis de nouveau utilisateur/connecté, je peux me connecter une deuxième fois. Je soumets le formulaire et j'obtiens:

L'URL actuelle, comptes/profil /, ne correspond à aucun de ces éléments.

Je n'ai pas déclaré cette URL dans urls.py.

Qu'est ce que je fais mal? Pourquoi le framework souhaite rediriger vers cette URL?

39
Codium

Django.contrib.auth.views.login vous redirige vers accounts/profile/ juste après vous être connecté.
Vous pouvez définir LOGIN_REDIRECT_URL dans votre settings.py fichier à tout ce que vous aimez ..

79
Traian

expliqué dans le doc :

(comptes/profil/est ...) L'URL où les demandes sont redirigées après la connexion lorsque la vue contrib.auth.login n'obtient aucun paramètre suivant.

Parce que vous êtes encore authentifié, votre demande est redirigée vers cette URL. Pour éviter la redirection, vous devez déconnecter l'utilisateur avant de l'envoyer à user/login, créez votre vue de connexion personnalisée ou ajoutez le paramètre suivant .

7
dani herrera

@CpS a fourni une très bonne solution, je veux juste l'améliorer un peu:

Par exemple, vous avez les URL suivantes:

urlpatterns = [
    # Django's login/logout
    url(r'login/$', 'Django.contrib.auth.views.login', name='login'),
    url(r'logout/$', 'Django.contrib.auth.views.logout', name='logout'),
    url(r'logout-then-login/$', 'Django.contrib.auth.views.logout_then_login', name='logout_then_login'),
    url(r'^$', views.dashboard, name='dashboard')
]

et dashboard.html est l'endroit où vous souhaitez rediriger après une connexion réussie, alors vous pouvez modifier votre fichier settings.py en conséquence:

from Django.core.urlresolvers import reverse_lazy

LOGIN_REDIRECT_URL=reverse_lazy('dashboard')
LOGIN_URL=reverse_lazy('login')
LOGOUT_URL=reverse_lazy('logout')

Nous utilisons reverse_lazy() pour construire les URL dynamiquement. La fonction reverse_lazy() inverse les URL comme reverse(), mais vous pouvez l'utiliser lorsque vous devez inverser les URL avant le chargement de la configuration d'URL de votre projet.

5
Humoyun Ahmad

vérifiez votre login.html

<form method="post" action=".">
    ~blah~
    <input type="hidden" name="next" value="/"><!-- login.html must send "next" parameter, and "next" parameter value is url that you want to redirect.  -->
    ~blah~
</form>

bonne chance ~

2
chobo

Tout cela n'a pas fonctionné pour moi. J'ai utilisé une solution JavaScript:

Dans le login.html (où se trouvent les boutons de connexion sociale), je mets ce script qui stocke ensuite dans le stockage local ::

<script>
// Check for local storage
if (typeof(Storage) !== "undefined") {
    var h = window.location.href;
    if (h.indexOf("next") > 0){
        var tokens = h.split("=");
        var nextUrl = tokens[1];

        for(i = 2;i< tokens.length;i++){
            nextUrl += ("=" + tokens[i]);
        }
        localStorage.setItem("next",nextUrl);

    }
}
</script>

Dans la page vers laquelle les utilisateurs sont redirigés, j'ai utilisé le script suivant pour rediriger:

$(document).ready(function () {

    // Check for local storage
    if (typeof(Storage) !== "undefined") {
            var nextUrl = localStorage.getItem("next");
            if (nextUrl.length > 0){
                localStorage.setItem("next","");
                window.location = nextUrl;
            }
    }
    else {
        // Sorry! No web storage support..
    }
}
1
Avia