67 votes

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

J'ai commencé à utiliser la version 1.5 de Django et j'ai rencontré 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. Docs :

O de "nouveau style". Avant Django 1.3, une syntaxe comme {% url myview %} était interprétée interprétée de manière incorrecte (Django considérait que "myview" était le nom littéral d'une vue, et non une variable de modèle nommée myview). et non une variable de gabarit nommée myview). Django 1.3 et plus ont introduit la syntaxe {% load url from future %} pour apporter le comportement corrigé où myview était considéré comme une variable.

T future %} dans vos modèles, vous devrez changer des balises comme {% url myview %} en {% url "myview" %}. Si vous utilisiez {% load url from future %}, vous pouvez simplement supprimer cette ligne sous Django 1.5

T <a href=“{% url ‘auto.views.view_post’ post.slug %}”><h3>{{post.title}}</h3></a> mais j'ai obtenu une erreur Reverse pour 'auto.views.view_post' avec les arguments '('',)' et les arguments de mot-clé '{}' non trouvés :( Qu'est ce que je fais de mal ? Je vous remercie.

89voto

Stephen J. Fuhry Points 3549

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

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

Il passera en revue tous vos fichiers de modèles et les remplacera :

{% url something.else foo bar %}

avec cette

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

Attention, j'ai été un peu paresseux sur ce point, il peut se casser sur certaines constructions. Il sera quand même plus facile de chercher des erreurs dans un diff que de le faire à la main.

4voto

Abbasov Alexander Points 649

Pour exclure le dossier .git et éviter les erreurs, MacOS a 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'

3voto

Alasdair Points 36535

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

Maintenant, enlevez temporairement le url et vérifier que {{ post }} y {{ post.slug }} vous donnent les valeurs que vous attendez. Le message d'erreur arguments '('',)' suggère que post.slug est le problème.

0voto

macmichael01 Points 41

Si vous utilisez Mac OS, vous devrez passer -e

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

0voto

shacker Points 3348

J'obtenais une erreur "ILLEGAL BYTE SEQUENCE" de sed avec la plupart de ces recettes, que j'ai pu résoudre 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 qui étaient entre guillemets simples, doubles ou sans guillemets. C'était le bordel. Il s'est avéré que l'approche la plus propre était de rechercher dans le répertoire templates avec mon éditeur (Sublime) en mode regex pour :

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

(trouver toutes les occurrences qui n'ont pas déjà été citées) et les passer en revue visuellement. Cela s'est avéré plus rapide et plus propre que d'essayer de l'automatiser et de nettoyer le désordre après coup.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X