Reputation: 43
I am trying to submit the form to my view:
in trending.html:
{% extends 'djangobin/base.html' %}
{% load static %}
{% load humanize %}
{% block title %}
Trending {{ lang.name }} Snippets - {{ block.super }}
{% endblock %}
{% block main %}
<h5><i class="fas fa-chart-line"></i> Trending {{ lang.name }} Snippets</h5>
<hr>
<table class="table">
<thead>
<tr>
<th>Title</th>
<th>Date</th>
<th>Hits</th>
<th>Language</th>
<th>User</th>
</tr>
</thead>
<tbody>
{% for snippet in snippets %}
<tr>
<td><i class="fas fa-globe"></i>
<a href="{{ snippet.get_absolute_url }}">{{ snippet.title }}</a>
</td>
<td title="{{ snippet.created_on }}">{{ snippet.created_on|naturaltime }}</td>
<td>{{ snippet.hits }}</td>
<td><a href="{% url 'trending_snippets' snippet.language.slug %}">{{ snippet.language }}</a></td>
{% if not snippet.user.profile.private %}
<td><a href="{{ snippet.user.profile.get_absolute_url }}">{{ snippet.user.username|title }}</a></td>
{% else %}
<td>-</td>
{% endif %}
</tr>
{% empty %}
<tr class="text-center">
<td colspan="4">There are no snippets.</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
in views.py:
from django.shortcuts import HttpResponse, render, redirect, get_object_or_404, reverse
from .forms import SnippetForm
from .models import Language, Snippet
def trending_snippets(request, language_slug=''):
lang = None
snippets = Snippet.objects
if language_slug:
snippets = snippets.filter(language__slug=language_slug)
lang = get_object_or_404(Language, slug=language_slug)
snippets = snippets.all()
return render(request, 'djangobin/trending.html', {'snippets': snippets, 'lang': lang})
in urls.py:
from django.conf.urls import url
from . import views as views
urlpatterns = [
url('^trending/$', views.trending_snippets, name='trending_snippets'),
url('^trending/(?P<language_slug>[\w]+)/$', views.trending_snippets, name='trending_snippets'),
]
I got the following error:
NoReverseMatch at /trending/ Reverse for 'trending_snippets' with arguments '('c-sharp',)' not found. 2 pattern(s) tried: ['trending/(?P[\w]+)/$', 'trending/$']
Exception Type: NoReverseMatch
Error during template rendering
Reference website: overiq.com
Reference website Link: https://overiq.com/django-1-11/creating-trending-snippet-page/
Python version: 3.8.2
Django version: 3.0.5
OS: Windows 8.1(32 bit)
Upvotes: 2
Views: 319
Reputation: 8187
Since it's a slug field you're matching, you can use the built-in slug path converter Django provides to match it by using path
instead of url
.
Change:
url('^trending/(?P<language_slug>[\w]+)/$', views.trending_snippets, name='trending_snippets'),
to:
path('trending/<slug:language_slug>)/', views.trending_snippets, name='trending_snippets'),
Note that slug:
matches hyphens, underscores, and also ASCII letters and numbers.
url()
is just an alias to re_path()
and may be deprecated in the future, so you should change your code accordingly.
Upvotes: 0
Reputation: 308889
To match c-sharp
, which contains a hyphen, you need to change [\w]
to [-\w]
.
url('^trending/(?P<language_slug>[-\w]+)/$', views.trending_snippets, name='trending_snippets'),
Upvotes: 1