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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top