Django release 1.5: 'url' requires a non-empty first argument. The syntax changed in Django 1.5

DjangoUrl

Django Problem Overview


I started using Django release 1.5 and got a problem with my old code:

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

Error: 'url' requires a non-empty first argument. The syntax changed in Django 1.5, see the docs. Docs:

> 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

Then I tried: <a href=“{% url ‘auto.views.view_post’ post.slug %}”><h3>{{post.title}}</h3></a> but got error Reverse for ‘auto.views.view_post’ with arguments ‘(’',)' and keyword arguments ‘{}’ not found. :( What am I doing wrong? Thx!

Django Solutions


Solution 1 - Django

I really hate doing all this junk by hand, so I wrote a sed script to do it for me. Make sure you have a backup first, then run this in your templates directory:

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

It'll go through all of your template files and replace this:

{% url something.else foo bar %}

with this

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

Be careful, I was a little lazy with this, it might break on some constructs. It's still going to be easier looking for errors in a diff than doing it by hand, though.

Solution 2 - Django

To exclude folder of .git and to avoid error's MacOS added empty quotes to option -i ''. Example:

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

But I like this approach (MacOS):

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

Solution 3 - Django

Firstly, you were correct to use single quotes for the view name, i.e. 'auto.views.view_post'.

Now, temporarily remove the url tag, and check that {{ post }} and {{ post.slug }} give you the values you expect. The error message arguments '('',)' suggests that post.slug is the problem.

Solution 4 - Django

If you are using Mac OS you'll need to pass -e

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

Solution 5 - Django

I was getting an "ILLEGAL BYTE SEQUENCE" error from sed with most of these recipes, which I was able to fix by doing this first:

LANG=C

However, these recipes generated tons of false positives on my project, and we already had a mix of url names that were single-quoted, double-quoted, or unquoted. It was a mess. Turned out the cleanest approach was to just search the templates directory with my editor (Sublime) in regex mode for:

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

(find all instances that weren't already quoted) and go through them visually. That turned out to be faster and cleaner than trying to automate it and then clean up the mess afterwards.

Solution 6 - Django

you may also need to do regexp-replace "\{% url "([\w:]+)" for "\{% url '$1' in order to aviod syntax errors like <a href="{% url "foo:bar" %}">baz</a>

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionWolterView Question on Stackoverflow
Solution 1 - DjangoStephen FuhryView Answer on Stackoverflow
Solution 2 - DjangoAbbasov AlexanderView Answer on Stackoverflow
Solution 3 - DjangoAlasdairView Answer on Stackoverflow
Solution 4 - Djangomac2017View Answer on Stackoverflow
Solution 5 - DjangoshackerView Answer on Stackoverflow
Solution 6 - DjangoriotedView Answer on Stackoverflow