Question

Ceci est mon point de vue de connexion:

def login(request):

    redirect_to = request.REQUEST.get("next")
    if request.method == 'POST': 

        formL = LoginForm(data=request.POST)           
        if formL.is_valid(): 

            if not redirect_to or '//' in redirect_to or ' ' in redirect_to:
                redirect_to = "/blogs/"

            from django.contrib.auth import login
            login(request, formL.get_user())
            if request.session.test_cookie_worked():
                request.session.delete_test_cookie()
            return HttpResponseRedirect(redirect_to)

    else:

    formL = LoginForm(request)                 

request.session.set_test_cookie()  

return render_to_response('blogs.html', {
    'formL': formL, }, context_instance=RequestContext(request))

login = never_cache (login)

Quand je vais, par exemple, example.com/myblog/ je suis à example.com/accounts/login/?next=/myblog redirect /

mais quand je utilisateur d'insérer et psw pour la connexion alors je suis redirection vers / blogs / et non / monblogue /

Pourquoi?

Edit: request.REQUEST.get ( 'next', '') retourne toujours ''

Je ne sais pas pourquoi: - \

Était-ce utile?

La solution

Comment votre formulaire connexion look modèle comme?

Votre problème

Vous n'êtes pas envoyer le chemin de redirect_to à votre modèle et vous devriez. Votre retour devrait ressembler à ceci:

return render_to_response('blogs.html', {
        'formL': formL,
        'next': redirect_to,
    }, context_instance=RequestContext(request)
)

L'action de formulaire de connexion devrait ressembler à ceci:

<form action="/your_login_url/?next={{ next }}" method="post">

Alors, quand vous allez à vous /myblog/ redirigés vers /your_login_url/?next=/myblog/, la vue de connexion rend alors le formulaire de connexion et remplace la variable next sous forme attribut de login d'action de sorte qu'il ressemble /your_login_url/?next=/myblog/ et lorsque vous soumettez le formulaire que vous journalisés et redirigé à /myblog/ (substance après if request.method == 'POST': est exécuté).

Selon vous, redirect_to = request.REQUEST.get("next") fonctionne très bien quand vous ne GET la page de connexion, mais lorsque vous POST à elle il n'y a pas de variable next jeu GET.

note également

vue Connexion ne devrait pas rendre votre blog, les blogs devraient voir faire.

Voici comment les regards de réponse retour de Django comme, notez la ligne où il est dit redirect_field_name: redirect_to,, redirect_field_name a la valeur de next par défaut.

return render_to_response(template_name, {
    'form': form,
    redirect_field_name: redirect_to,
    'site': current_site,
    'site_name': current_site.name,
}, context_instance=RequestContext(request))

Et, vous semblez ignorer le point de vue de connexion que pour la redirection par défaut? Ce n'est pas juste à mon humble avis. Le bon endroit pour définir ma position par défaut pour la redirection de connexion est dans votre settings.py en définissant LOGIN_REDIRECT_URL .

Mais, puisque vous écrivez votre propre point de vue de connexion pourquoi ne pas utiliser celui django comme un squelette puis expliquiez ce que vous avez besoin.

Autres conseils

Comme

 not redirect_to or '//' in redirect_to or ' ' in redirect_to

Equivaut à vrai?


Peut-être que si nous enseignons l'homme à pêcher? http://docs.python.org/library/logging.html

Mettre cela en haut

import logging
LOG_FILENAME = '/tmp/logging_example.out'
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG)

Mettre cela où il semble approprié dans votre code (par exemple après l'instruction if)

logging.debug("redirect_to = %s" % redirect_to)

Exécuter, regardez alors le contenu de '/tmp/logging_example.out'

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