2011-05-20 2 views
1

Je veux charger une vue particulière en fonction de l'URL, par exemple:Django - vue dynamique pour url

url(r'^channel/(?P<channel>\d+)/$', ---, name='channel_render'), 

Selon le canal passé dans l'url, je veux charger un fichier de vue spécifique. J'ai essayé de faire ceci:

def configure_view(channel): 
    print channel 

urlpatterns = patterns('', 
    url(r'^channel/(?P<channel>\d+)/$', configure_view(channel), name='channel_render'), 

Mais évidemment l'argument de canal n'est pas passé. Est-il possible de faire cela? La seule autre solution que je peux penser est de charger une vue de gestionnaire, puis de charger le fichier de vue pertinent à partir de là. Si c'est le seul moyen, comment puis-je rediriger vers un autre fichier de vue depuis une vue?

Répondre

0

Je pense que la meilleure façon de le faire est de charger une vue qui fonctionne comme un petit répartiteur, qui appelle la dernière vue qui vous intéresse.

En ce qui concerne la façon de le faire, les vues sont tout simplement fonctions qui sont appelées d'une manière particulière et attendues pour retourner une chose particulière. Vous pouvez appeler une vue d'une autre; Assurez-vous juste que vous retournez correctement le résultat.

Vous pouvez charger des vues à partir de différents fichiers avec import.

+0

Je préfère charger la vue de la même manière que django lorsque l'URL est résolue, j Ust importation à froid de la vue ne semble pas raison? Je jetterai un coup d'oeil à travers le code source et je verrai comment django importe les vues, peut-être qu'il y a une fonction que je peux détourner. – Hanpan

+0

Semble que je pourrais utiliser import_module de django.utils.importlib. Merci. – Hanpan

0

Essayez d'appeler comme une vue normale, par ex.

def configure_view(request, channel): 
    print channel 

url(r'^channel/(?P<channel>\d+)/$', configure_view, name='channel_render'), 
4

Vous pourriez faire quelque chose comme ceci.

#urls.py 
url(r'^channel/(?P<channel>\d+)/$', switcher, name='channel_render'), 

#views.py 
def switcher(request, channel): 
    if channel == 'Whatever': 
     return view_for_this_channel() 

def view_for_this_channel() 
    #handle like a regular view 

Si vous utilisez des vues de classe, l'appel dans votre switcher() ressemblera à ceci:

#views.py 
def switcher(request, channel): 
    if channel == 'Whatever': 
     return ViewForThisChannel.as_view()(request) # <-- call to CBV 

def ViewForThisChannel(View): 
    #handle like a regular class-based view