Question

quite new to Django and Python. Hoping to get some help on what went wrong with the below code. Basically, I am trying to create a url with and id and a slugfield e.g. something.com/1/arts-and-crafts.

Stucked and getting a NoReverseMatch error below:

Reverse for 'category' with arguments '(2, u'arts-and-crafts')' and keyword arguments '{}' not found. 2 pattern(s) tried: ['(?P\d+)/[-\w]+/$', '(?P\d+)/$']

Below is the code that I am using, would greatly appreciate any help in understanding what went wrong:

template html

<ul class="list-unstyled">
          {% for category in categories %}
            {% if forloop.counter < 10 %}
              <li><a href="{% url 'category' category.id category.slug %}">
                {{ category.cat_name}}</a></li>
            {% endif %}
          {% endfor %}
        </ul>

url.py

url(r'^(?P<cat_id>\d+)/[-\w]+/$', 'guides.views.category', name='category'),

views.py

def category(request, cat_id):
    categories = Category.objects.all()
    guides = Guide.objects.filter(category__id=cat_id).order_by("created_date").reverse()
    is_featured = Guide.objects.filter(category__id=cat_id).filter(featured=True)
    selected_category = get_object_or_404(Category, pk=cat_id)
    return render(request, 'guides/category.html', {'categories': categories, 'guides': guides, 'is_featured': is_featured, 'selected_category': selected_category})
Was it helpful?

Solution

Your URL doesn't capture the slug as a parameter, so it can't be used in the reverse call. Either change the second pattern to (?P<slug>[-\w]+) or don't use category.id in the {% url %} tag.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top