2010-04-27 4 views
4

Fondamentalement, j'essaie de rediriger les personnes qui ne sont pas connectés à la page de connexion.Django: HttpResponseRedirect ne passe pas RequestContext()?

Ce que je suis actuellement en utilisant est:

return render_to_response('login.html', context_instance=RequestContext(request)) 

Mais qui laisse l'URL à la page d'accueil. Je voudrais avoir des comptes rediriger vers// login /, mais quand je l'utilise

return HttpResponseRedirect('/accounts/login/') 

j'obtiens l'erreur

Key 'username' not found in <QueryDict: {}> 

Je comprends que pour dire que je ne besoin d'avoir Y a-t-il une bonne redirection, et passe-t-il quand même RequestContext?

Répondre

5

RequestContext est uniquement utilisé pour transmettre des valeurs au moteur de gabarit lors du rendu d'un gabarit. La vue de destination ne doit pas dépendre du RequestContext de la vue d'origine, elle devrait être capable de générer son propre RequestContext.

Il existe toutefois des situations où vous devez transmettre des valeurs entre des vues comme celle-ci. Dans ces situations, vous pouvez utiliser les valeurs de chaîne de requête pour le faire. Par exemple ...

def originating_view(request, *args, **kwargs): 
    return HttpResponseRedirect('/accounts/login/?username=%s&next=%s' % (username, request.path) 

def destination_view(request, *args, **kwargs): 
    # Get the username from the querystring 
    username = request.GET.get('username', None) 
    next = request.GET.get('next', '/') 

    if username: 
     # ... 

(Notez que je suppose que la raison pour laquelle vous souhaitez conserver le nom d'utilisateur est de l'avoir pré-rempli dans le formulaire de connexion. Si vous effectuez une connexion réelle que vous » Je veux utiliser POST à ​​la place pour que le nom d'utilisateur et le mot de passe ne soient pas enregistrés en texte clair dans l'URL).

+0

Merci pour la réponse. Je me suis rendu compte que mon problème était plutôt stupide et n'avait rien à voir avec ce que j'ai posté ci-dessus. Il s'avère que j'ai oublié de passer une context_instance dans ma vue de connexion ... Cependant, votre commentaire m'a effectivement aidé ailleurs, alors merci beaucoup! –

+1

@Stone mais un requestcontext peut être nécessaire en cas de jeton csrf. https://docs.djangoproject.com/fr/dev/ref/contrib/csrf/. Ainsi, lors de la vue Httpresponseredirect, aucun contexte de requête n'est utilisé. Ce ne serait pas un problème? –

+0

J'ai utilisé une requête ajax et j'ai envoyé une redirection en cas d'échec pour que json affiche une réponse invalide et render_to_response en cas de succès.Failure fonctionne bien mais en cas de succès je vois le template envoyé par render_to_response sur la même page ... Comment faire face à cela .. – cafebabe1991

Questions connexes