web-dev-qa-db-fra.com

Django release 1.5: 'url' nécessite un premier argument non vide. La syntaxe a changé dans Django 1.5

J'ai commencé à utiliser Django version 1.5 et j'ai eu un problème avec mon ancien code:

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

Erreur: 'url' nécessite un premier argument non vide. La syntaxe a changé dans Django 1.5, voir la documentation. Documents:

Une caractéristique obsolète à noter est le passage à la balise d'URL "nouveau style". Avant Django 1.3, une syntaxe telle que {% url myview%} était mal interprétée (Django considérait que "myview" était le nom littéral d'une vue, pas une variable de modèle nommée myview). Django 1.3 et supérieur ont introduit la syntaxe {% load url from future%} pour apporter le comportement corrigé où myview était vu comme une variable.

Le résultat est que si vous n'utilisez pas {% load url from future%} dans vos modèles, vous devrez remplacer les balises comme {% url myview%} par {% url "myview"%}. Si vous utilisiez {% load url from future%}, vous pouvez simplement supprimer cette ligne sous Django 1.5

Ensuite, j'ai essayé: <a href=“{% url ‘auto.views.view_post’ post.slug %}”><h3>{{post.title}}</h3></a> Mais j'ai obtenu l'erreur inverse pour "auto.views.view_post" avec les arguments "(" ",)" et les arguments de mot-clé "{}" introuvables. :( Qu'est-ce que je fais mal? Thx!

67
Wolter

Je déteste vraiment faire toutes ces ordures à la main, alors j'ai écrit un script sed pour le faire pour moi. Assurez-vous d'abord d'avoir une sauvegarde, puis exécutez-la dans votre répertoire de modèles:

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

Il passera par tous vos fichiers de modèle et remplacera ceci:

{% url something.else foo bar %}

avec ça

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

Attention, j'étais un peu paresseux avec ça, ça pourrait casser sur certaines constructions. Cependant, il sera toujours plus facile de rechercher des erreurs dans un diff que de le faire à la main.

89
Stephen Fuhry

Pour exclure le dossier de .git et pour éviter l'erreur MacOS ajouté des guillemets vides à l'option -i ''. Exemple:

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

Mais j'aime cette approche (MacOS):

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

Tout d'abord, vous aviez raison d'utiliser des guillemets simples pour le nom de la vue, c'est-à-dire 'auto.views.view_post'.

Maintenant, supprimez temporairement la balise url et vérifiez que {{ post }} Et {{ post.slug }} Vous donnent les valeurs que vous attendez. Le message d'erreur arguments '('',)' suggère que post.slug Est le problème.

3
Alasdair

vous devrez peut-être également faire regexp-replace "\{% url "([\w:]+)" for "\{% url '$1' afin d'éviter les erreurs de syntaxe comme <a href="{% url "foo:bar" %}">baz</a>

0
rioted

J'obtenais une erreur "ILLEGAL BYTE SEQUENCE" de sed avec la plupart de ces recettes, que j'ai pu corriger en faisant d'abord ceci:

LANG=C

Cependant, ces recettes ont généré des tonnes de faux positifs sur mon projet, et nous avions déjà un mélange de noms d'URL entre guillemets simples, entre guillemets doubles ou sans guillemets. C'était le bordel. Il s'est avéré que l'approche la plus propre était de simplement rechercher le répertoire des modèles avec mon éditeur (Sublime) en mode regex pour:

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

(trouvez toutes les instances qui ne sont pas déjà citées) et parcourez-les visuellement. Cela s'est avéré plus rapide et plus propre que d'essayer de l'automatiser puis de nettoyer le gâchis par la suite.

0
shacker

Si vous utilisez Mac OS, vous devrez passer -e

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