2010-10-25 4 views
2

J'ai une application qui sert des pages comme ceci/stage/stagename. stagename est variable. Les mappeurs d'URL recherchent simplement un [0-9A-Za-z] + pour remplir ce slot.URL de connexion/déconnexion dynamiques dans Django

Maintenant, à cause de ma configuration, mon application sera basée sur/stage/stagename. Je ne peux pas changer cela (sans changements massifs à mon installation qui est trop fastidieux en ce moment et une dernière option).

Je dois utiliser django.contrib.auth. Les URL de connexion et de déconnexion ne peuvent pas être dans mon fichier de configuration, car elles changeront en fonction de l'emplacement de mon application (par exemple,/stage/foo/login et pour l'autre, il se peut que/stage/bar/login).

Comment puis-je faire en sorte que le backend utilise des URL aussi dynamiques?

J'ai aussi le problème que j'ai besoin de passer le stagename paramètre au modèle qui génère mon URL. Comment puis je faire ça?

+0

"changements massifs à mon installation qui est trop fastidieux en ce moment et une dernière option" Un très mauvais signe. Très très mauvais. Vous devriez probablement arrêter ce que vous faites. Jetez ça et recommencez. Démarrage frais pourrait être moins cher que d'aller de l'avant. –

+0

Je suis d'accord et j'ai une branche du code où j'ai corrigé à moitié mes erreurs.Cependant, j'ai une date limite que je dois respecter maintenant et je n'ai pas d'autre choix que de faire en sorte que cela fonctionne. –

+0

"Travaillez d'une manière ou d'une autre". Parfois, recommencer est plus rapide que d'avancer. –

Répondre

1

Si vous pouvez obtenir redirect_to dans le contexte de votre modèle de connexion, il existe un mécanisme que vous pouvez utiliser pour choisir de modifier l'URL de redirection.

Dans votre modèle de connexion, ajoutez une entrée supplémentaire cachée à la forme

<input type="hidden" name="next" value="{% url redirect_to %}"> 

maintenant dans votre fichier urls.py, vous pouvez spécifier les entrées à utiliser pour la redirection:

url(r'^login/$', 
    auth_views.login, 
    {'template_name': 'registration/login.html', 
    'redirect_field_name': 'next'}, 
    name='auth_login'), 

Si vous faites cela, vous serez redirigé vers différents endroits en fonction de la valeur de redirect_to.

Vous pourriez être en mesure d'obtenir redirect_to dans votre contexte en ayant plus d'une URL de connexion nommé:

url(r'^login/$', 
    auth_views.login, 
    {'template_name': 'registration/login.html', 
    'redirect_field_name': 'next', 
    'extra_context': {'redirect_to': 'foo_url'} 
    }, 
    name='foo_login'), 

url(r'^login/$', 
    auth_views.login, 
    {'template_name': 'registration/login.html', 
    'redirect_field_name': 'next', 
    'extra_context': {'redirect_to': 'bar_url'} 
    }, 
    name='bar_login'), 

Ou si vous ne voulez pas faire ce genre de chose, vous pouvez utiliser dans quelque chose session à la place:

<input type="hidden" name="next" value="{% url session.redirect_to %}"> 

Espérons que cela aide, et des excuses s'il y a des fautes de frappe dans le code! La documentation de la vue Auth login est un peu difficile à lier à link. Allez sur ce lien et faites défiler un peu plus haut!

+0

Ceci est utile. Je n'étais pas au courant de cela. Merci! –

0

/stage/foo/login et pour l'autre, cela pourrait être/stage/bar/login).

url(r'^stage/(?P<name>[^/]+)/login/$', some_view_function) 

peut-être ce que vous cherchez.

Cependant, vous semblez avoir plus de problèmes que cela. "des changements massifs à ma configuration qui est trop fastidieux" indiquent des problèmes plus sérieux et fondamentaux.

+0

J'ai quelque chose comme ça mais je ne peux pas le mettre dans mon 'settings.py'. Il doit être codé en dur ici. –

+0

Ce n'est pas censé être dans votre settings.py. C'est supposé être dans votre urls.py. Qu'est-ce que tu fais? –

+0

'LOGIN_URL = '/ login'' dans le' settings.py' pour lui donner l'URL vers laquelle il devrait rediriger pour présenter le formulaire de connexion. J'utilise une version légèrement plus ancienne de Django pour laquelle je ne peux pas passer le paramètre 'login_url' au décorateur. –