2013-02-14 17 views
66

ho iniziato ad usare Django Versione 1.5 e ha un problema con il mio vecchio codice:Django release 1.5: 'url' richiede un primo argomento non vuoto. La sintassi cambiato in Django 1.5

<a href="{% url auto.views.viewpost post.slug %}"><h3>{{post.title}}</h3></a> 

Errore: 'url' richiede un primo argomento non vuoto. La sintassi è cambiata in Django 1.5, vedi i documenti. Documenti:

One deprecated feature worth noting is the shift to “new-style” url tag. Prior to Django 1.3, syntax like {% url myview %} was interpreted incorrectly (Django considered "myview" to be a literal name of a view, not a template variable named myview). Django 1.3 and above introduced the {% load url from future %} syntax to bring in the corrected behavior where myview was seen as a variable.

The upshot of this is that if you are not using {% load url from future %} in your templates, you’ll need to change tags like {% url myview %} to {% url "myview" %}. If you were using {% load url from future %} you can simply remove that line under Django 1.5

Poi ho provato: <a href=“{% url ‘auto.views.view_post’ post.slug %}”><h3>{{post.title}}</h3></a> ma ottenuto l'errore d'inversione per ‘auto.views.view_post’ con argomenti ‘(’ ')' e gli argomenti delle parole chiave ‘{}’ non trovato. :( Che cosa sto facendo di sbagliato? Thx!

+0

è '' auto' sul PYTHONPATH' di Django? Forse hai bisogno di qualcosa come ''somedir.auto.views.view_post'' lì? E una domanda più ovvia è "auto.views.view_post" menzionata nel tuo URLconf? –

risposta

87

odio davvero fare tutta questa spazzatura a mano, così ho scritto uno script sed per farlo per me. assicuratevi di avere un prima fai il backup, poi eseguilo nei tuoi modelli di canonica:

find . -type f -print0 | xargs -0 sed -i 's/{% url \([^" >][^ >]*\)/{% url "\1"/g' 

Andrà attraverso tutte le file di template e sostituire questo:

{% url something.else foo bar %} 

con questo

{% url "something.else" foo bar %} 

Attenzione, ero un po 'pigro con questo, potrebbe rompersi su alcuni costrutti. Tuttavia, sarà ancora più facile cercare gli errori in una diff rispetto a farlo a mano.

+7

Per persone che usano un editor (ultraedit ecc.) Per risolvere questo problema. Questa espressione unix ha fatto il lavoro per me: Trova: ({% url +) ([0-9a-z _] +) Sostituisci con: \ 1 '\ 2' –

+7

per utenti mac: 'find. -tipo f -print0 | xargs -0 sed -i.bak -e 's/url \ ([^ ">] [^>] * \)/url" \ 1 "/ g'' questo creerà un file di backup per ogni ramo di ricambio – Hassek

+0

fix_urls; git checkout fix_urls; find. -type f -print0 | xargs -0 sed -i 's/url \ ([^ ">] [^>] * \)/url" \ 1 "/ g'; git gui/quindi testare e unire. Ci sono voluti alcuni minuti per correre sul mio progetto. Quindi non spaventarti se stai aspettando 5 minuti –

3

In primo luogo, si dovesse corretto utilizzare virgolette singole per il nome della vista, vale a dire 'auto.views.view_post'.

Ora, rimuovere temporaneamente il tag url, e controllare che {{ post }} e {{ post.slug }} darvi i valori che ci si aspetta. il messaggio di errore arguments '('',)' suggerisce che post.slug è il problema.

0

Se si utilizza Mac OS dovrete passare -e

find . -type f -print0 | xargs -0 sed -i -e 's/ url \([^" >][^ >]*\)/ url "\1"/g' 
+1

Questo non ha funzionato per me.Ha appena creato un gruppo di nomi di file html-e – Gourneau

+0

Questa soluzione è corretta, ma non dice che salva anche un backup di tutti i file con un suffisso -e –

3

Per escludere la cartella di .git e per evitare MacOS di errore aggiunto citazioni vuote per opzione -i ''. Esempio:

find . -path '*/.git*' -prune -o -type f -print0 | xargs -0 sed -i '' 's/ url \([^" >][^ >]*\)/ url "\1"/g' 

Ma mi piace questo approccio (MacOS):

grep '{% url' -lrZ . | xargs -0 sed -i '' 's/ url \([^" >][^ >]*\)/ url "\1"/g' 
+0

Che cosa ha a che fare con la domanda? –

+0

Sono stati risolti rapidamente problemi di migrazione da django 1.4 a 1.5 per il tag modello di url –

+0

Questa domanda ha accettato rispondi ed è svalutato 7 volte !! –

0

stavo ottenendo un errore "Illegal sequenza di byte" da sed con la maggior parte di queste ricette, che sono stato in grado di risolvere da fare questo prima:

LANG=C 

tonnellate Tuttavia, queste ricette hanno generato falsi positivi sul mio progetto, e abbiamo già avuto un mix di nomi di URL che sono stati tra apici singoli, doppi apici, o non quotate. Era un casino. Si è rivelato l'approccio più pulito è stato quello di cercare solo nella directory dei modelli con il mio editore (Sublime) in modalità regex per:

\{\%\ url\ [^'] 
\{\%\ url\ [^"] 

(trovare tutte le istanze che non sono stati già citato) e passare attraverso di loro visivamente. Ciò si è rivelato più veloce e più pulito rispetto al tentativo di automatizzarlo e quindi ripulire il caos in seguito.

0

potrebbe anche essere necessario fare regexp-sostituire "\{% url "([\w:]+)" per "\{% url '$1' per aviod errori di sintassi come <a href="{% url "foo:bar" %}">baz</a>

Problemi correlati