2010-12-13 70 views
0

Je fais un genre de routage complexe dans Django. J'ai une collection d'applications où la vue dépendra des variables d'URL qui sont passées. Par exemple, dans mon URL, j'ai un profil slug et un module slug. Si l'utilisateur connecté a l'autorisation, il verra quel que soit le profil en fonction du slug de profil dans l'URL. S'ils ont l'autorisation, ils verront quel module dépend du slug du module dans l'URL et s'il s'agit d'un enfant du profil sélectionné.Est-il possible d'acheminer vers une vue particulière en fonction des variables d'URL transmises?

Les modules sont fondamentalement différentes applications. Un des modules est une liste de tâches et un autre est une liste de médias etc. Parce que l'utilisateur peut avoir plusieurs modules de tâches ou plusieurs modules de médias, chacun avec leur propre slug, j'ai besoin d'un chemin de routage vers la tâche ou la vue média selon l'URL est.

Par exemple:

http://127.0.0.1:8000/james-morris/wedding/ --- ce sera au profil de James-morris 'et le module « mariage » qui se trouve être une liste de tâches et doit aller aux tâches voir

http://127.0.0.1:8000/james-morris/icons/ --- ce sera au profil de James-morris ' « icônes » et le module qui se trouve être une liste des médias et doit aller à la vue des médias

Comment puis-je aborder faire ce genre de routage dans Django? Un grand merci, James

Répondre

2

Peut-être que je me trompe, mais je crois que quelque chose comme ça le ferait déjà.

def redirect(request, username, module): 
    '''do some stuff here...''' 
    if username.has_icons(): 
     return show_icon(request, username) 
    #elif ... something else... 

urlpatterns = patterns('', 
    (r'^(?P<username>\w+)/(?P<module>\w+)/$', redirect), 
) 
+0

Cela ne fonctionnerait pas dans ce sens, car le «mariage» ou «icônes» est un limace qui est totalement à la hauteur de l'utilisateur. Donc, je ne sais pas si c'était «mariage» ou «icônes» avant la main pour définir cela dans les URL. Merci beaucoup pour la réponse :) – littlejim84

+0

@ littlejim84: dans ce cas, vous devez créer une fonction pour router les vues vous-même. Vous pouvez simplement créer une fonction qui renvoie un appel à une autre vue. – Wolph

+0

Dans ce cas particulier, cette solution fonctionne bien pour moi. Merci beaucoup. – littlejim84

1

Est-il possible d'acheminer à une vue particulière en fonction des variables d'URL passé?
La méthode la plus propre pour effectuer le routage serait de respecter la règle de base REST - Une URL par ressource. Donc, la meilleure chose à faire serait d'atterrir dans la vue sur la base de l'URL et ensuite vous pouvez créer un if..elif..else .. bloquer pour vérifier diverses variables passées et acheminer en conséquence aux différents vue (s).

En ce qui concerne les exemples que vous avez mentionnés, Django devrait vous guider vers différents points de vue, si vous ne ciblez pas la même vue dans votre urls.py

0

En tant que variante de la solution de Sidharth Sharma, si vous avez besoin vérifier les autorisations puis une autre option est d'avoir une application spécifiquement pour faire le réacheminement. L'affichage dans cette application fait ensuite un HttpResponseRedirect à l'URL spécifique à l'application que vous voulez.

urlpatterns = patterns('', 
    (r'^(?P<username>\w+)/?P<option>/$', 'reroute.views.direct'), 
    (r'^(?P<username>\w+)/wedding/$', 'wedding.views.tasks'), 
    (r'^(?P<username>\w+)/icons/$', 'icons.views.media'), 
) 

def direct(request, username, option): 

    if has_condition_for_wedding: 
     HttpResponseRedirect('/username/wedding/') 
    else: 
     HttpResponseRedirect('/username/icons/')