Django: come posso creare un routing url generico per le viste?
Domanda
Ho un'app django piuttosto standard e mi chiedo come impostare il routing dell'URL in modo da non dover mappare esplicitamente ciascun url su una vista.
Ad esempio, supponiamo che io abbia le seguenti visualizzazioni: Progetto, Link, Profilo, Contatto
. Preferirei non avere i miei urlpatterns
in questo modo:
(r'^Project/
E così via. In Piloni , sarebbe semplice come:
map.connect(':controller/:action/:id')
E afferrerebbe automaticamente il controller e la funzione giusti. C'è qualcosa di simile in Django?
, 'mysite.app.views.project'),
(r'^Links/
E così via. In Piloni , sarebbe semplice come:
<*>
E afferrerebbe automaticamente il controller e la funzione giusti. C'è qualcosa di simile in Django?
, 'mysite.app.views.links'),
(r'^Profile/
E così via. In Piloni , sarebbe semplice come:
<*>
E afferrerebbe automaticamente il controller e la funzione giusti. C'è qualcosa di simile in Django?
, 'mysite.app.views.profile'),
(r'^Contact/
E così via. In Piloni , sarebbe semplice come:
<*>
E afferrerebbe automaticamente il controller e la funzione giusti. C'è qualcosa di simile in Django?
, 'mysite.app.views.contact'),
E così via. In Piloni , sarebbe semplice come:
<*>E afferrerebbe automaticamente il controller e la funzione giusti. C'è qualcosa di simile in Django?
Soluzione
mods = ('Project','Links','Profile','Contact')
urlpatterns = patterns('',
*(('^%s/%n, 'mysite.app.views.%s'%n.lower()) for n in mods)
)
Altri suggerimenti
A meno che tu non abbia un enorme numero di visualizzazioni, scriverle esplicitamente non è male, dal punto di vista dello stile.
Puoi abbreviare il tuo esempio, tuttavia, usando l'argomento prefisso della funzione pattern
:
urlpatterns = patterns('mysite.app.views',
(r'^Project/, 'project'),
(r'^Links/, 'links'),
(r'^Profile/, 'profile'),
(r'^Contact/, 'contact'),
)
Potresti essere in grado di utilizzare una funzione di visualizzazione speciale in questo senso:
def router(request, function, module):
m =__import__(module, globals(), locals(), [function.lower()])
try:
return m.__dict__[function.lower()](request)
except KeyError:
raise Http404()
e quindi un urlconf come questo:
(r'^(?P<function>.+)/
Questo codice non è testato ma l'idea generale dovrebbe funzionare, anche se dovresti ricordare:
L'esplicito è meglio che implicito.
, router, {"module": 'mysite.app.views'}),
Questo codice non è testato ma l'idea generale dovrebbe funzionare, anche se dovresti ricordare:
L'esplicito è meglio che implicito.