Whats the correct way to use and refer to a slugfield in a django 1.3
for example the following code should link via slug to a generic view however the NoReverseMatch error is received.
Caught NoReverseMatch while rendering: Reverse for 'single_post' with arguments '('', u'post-2')' and keyword arguments '{}' not found.
From my understanding this saying that the error lies in the template however being a newbie and having tried many different variations on {% url single_post slug=post.slug %} this may not be the case.
Could someone please explain why this is happening so that I can understand where the problem lies andhow to fix.
Ive tried {% url single_post slug=post.slug %},{% url single_post slug %}{% url single_post slug=post.slug %} and many other variations
All help is greatly appreciated
model
slug = models.SlugField(max_length=120, unique=True)
url
url(r'^post/(?P<slug>[a-z-]+)/$', list_detail.object_detail,
{'queryset': Post.objects.all(), 'template_object_name': 'post', 'slug_field': 'slug'}, name="single_post"),
template
{% url single_post slug post.slug %}
A slug value can contain any
a-z
,A-Z
,0-9
,_
and-
. The first 3 are represented by the special characterw
and since-
itself is a special character, we need to use represent them both using a backslash\
. So the correct expression becomesAt least this is what is working in my case.
In your template, assuming
post
is an instance of your model:Your url regex should look like the following:
To test the above regex, try to access a few posts directly in your browser with a variety of valid slugs and see if they works. Once this is done, start testing the url names.
Your regex doesn't allow for numeric values. Try:
In Django 1.5 the slug validator uses this regex:
See https://github.com/django/django/blob/stable/1.5.x/django/core/validators.py#L106
You can use this regex in urls.py:
In earlier versions it was
[-\w]+
but I guess in Python3 \w matches non ascii characters like umlauts.