Domanda

Esiste un modo per far passare un parametro predefinito a un'azione nel caso in cui regex non corrispondesse a nulla usando django?


urlpatterns = patterns('',(r'^test/(?P<name>.*)?

Ho provato a impostare il terzo parametro negli urlpatterns su un dizionario contenente 'e dando al parametro name un valore predefinito sul metodo, nessuno dei quali ha funzionato. il parametro name sembra sempre essere None. Non voglio davvero codificare un controllo per None se potessi impostare un valore predefinito.

Chiarimento: ecco un esempio di cosa lo stavo cambiando.


def displayName(request,name='Steve'):
      return HttpResponse(name)
#i also tried

urlpatterns = patterns('',
      (r'^test/(?P<name>.*)?

quando indico il mio browser alla vista, viene visualizzato il testo 'Nessuno'

Qualche idea?

,'myview.displayName')) #myview.py def displayName(request,name): # write name to response or something

Ho provato a impostare il terzo parametro negli urlpatterns su un dizionario contenente 'e dando al parametro name un valore predefinito sul metodo, nessuno dei quali ha funzionato. il parametro name sembra sempre essere None. Non voglio davvero codificare un controllo per None se potessi impostare un valore predefinito.

Chiarimento: ecco un esempio di cosa lo stavo cambiando.

<*>

quando indico il mio browser alla vista, viene visualizzato il testo 'Nessuno'

Qualche idea?

, 'myview.displayName', dict(name='Test') ) )

quando indico il mio browser alla vista, viene visualizzato il testo 'Nessuno'

Qualche idea?

,'myview.displayName')) #myview.py def displayName(request,name): # write name to response or something

Ho provato a impostare il terzo parametro negli urlpatterns su un dizionario contenente 'e dando al parametro name un valore predefinito sul metodo, nessuno dei quali ha funzionato. il parametro name sembra sempre essere None. Non voglio davvero codificare un controllo per None se potessi impostare un valore predefinito.

Chiarimento: ecco un esempio di cosa lo stavo cambiando.

<*>

quando indico il mio browser alla vista, viene visualizzato il testo 'Nessuno'

Qualche idea?

È stato utile?

Soluzione

Il problema è che quando il pattern viene confrontato con 'test /' il groupdict catturato da regex contiene la mappatura 'name' = > Nessuno:

>>> url.match("test/").groupdict()
{'name': None}

Ciò significa che quando viene invocata la vista, usando qualcosa che mi aspetto sia simile al seguente:

view(request, *groups, **groupdict)

che equivale a:

view(request, name = None)

per "test /", il che significa che al nome è assegnato Nessuno anziché non assegnato.

Questo ti lascia con due opzioni. Puoi:

  1. Controlla esplicitamente Nessuno nel codice di visualizzazione che è una specie di hacking.
  2. Riscrivi la regola di invio dell'URL per rendere la cattura del nome non facoltativa e introdurre una seconda regola da catturare quando non viene fornito alcun nome.

Ad esempio:

urlpatterns = patterns('',
    (r'^test/(?P<name>.+)

Quando si adotta il secondo approccio, è possibile semplicemente chiamare il metodo senza il modello di acquisizione e lasciare che Python gestisca il parametro predefinito oppure è possibile chiamare una vista diversa che delega.

,'myview.displayName'), # note the '+' instead of the '*' (r'^test/

Quando si adotta il secondo approccio, è possibile semplicemente chiamare il metodo senza il modello di acquisizione e lasciare che Python gestisca il parametro predefinito oppure è possibile chiamare una vista diversa che delega.

,'myview.displayName'), )

Quando si adotta il secondo approccio, è possibile semplicemente chiamare il metodo senza il modello di acquisizione e lasciare che Python gestisca il parametro predefinito oppure è possibile chiamare una vista diversa che delega.

Altri suggerimenti

Ho pensato che potessi def displayName (request, name = defaultObj) ; questo è quello che ho fatto in passato, almeno. A cosa stavi impostando il valore predefinito?

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