I have the following error in Django, I'm new to Django and i Cant seem to figure where the error is coming from. no tutorial seems to help either. I have a feeling the error might be coming from urls.py but cant seem to navigate it
where do you think the error is?
NoReverseMatch at /
Reverse for 'subcategory_detail' with arguments '('DEFAULT VALUE',)' not found. 2 pattern(s) tried: ['category/(?P<category_slug>[\\w-]+)/$', '$']
Here is my models.py
from django.db import models
from django.urls import reverse
from django.utils.text import slugify
from datetime import datetime
class Category(models.Model):
title = models.CharField(max_length=30, default="Random")
slug = models.SlugField(max_length=100, unique=True, blank=True, null=True)
category_thumbnail = models.CharField(max_length=400, default='DEFAULT VALUE', blank=True, null=True)
category_description = models.CharField(max_length=400, default='DEFAULT VALUE', blank=True, null=True)
def __str__(self):
return self.title
class Meta:
verbose_name_plural = "Categories"
def get_absolute_url(self):
return reverse("subcategory_detail", args=[self.slug])
class SubCategory(models.Model):
title = models.CharField(max_length=30, default="Random")
categories = models.ForeignKey(Category, on_delete=models.CASCADE, blank=True, null=True)
slug = models.SlugField(max_length=100, unique=True, blank=True, null=True)
subcategory_thumbnail = models.CharField(max_length=400, default='DEFAULT VALUE', blank=True, null=True)
subcategory_description = models.CharField(max_length=400, default='DEFAULT VALUE', blank=True, null=True)
def __str__(self):
return self.title
class Meta:
verbose_name_plural = "SubCategories"
class Tag(models.Model):
name = models.CharField(max_length=100, unique=True, blank=True, null=True)
slug = models.SlugField(max_length=100, unique=True, blank=True, null=True)
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('lesson_by_tag', args=[self.slug])
class Lessons(models.Model):
title = models.CharField(max_length=200)
slug = models.SlugField(unique=True, blank=True, null=True)
overview = models.TextField()
timestamp = models.DateTimeField(default=datetime.now, blank=False)
thumbnail = models.CharField(max_length=200)
categories = models.ForeignKey(Category, on_delete=models.CASCADE, blank=True, null=True)
subcategories = models.ForeignKey(SubCategory, on_delete=models.CASCADE, blank=True, null=True)
tags = models.ManyToManyField(Tag)
def __str__(self):
return self.title
def save(self, *args, **kwargs):
self.slug = slugify(self.title)
super(Lessons, self).save(*args, **kwargs)
def get_absolute_url(self):
return reverse('lesson_detail', args=[self.id, self.slug])
My views.py
from django.contrib.admin import helpers
from .models import Lessons, Category, SubCategory, Tag
from django.shortcuts import render, reverse, get_object_or_404, get_list_or_404
from django.db.models import Q
def index(request):
queryset = Category.objects.all()
context = {
'object_list': queryset
}
return render(request, 'index.html', context)
def post_by_category(request, category_slug):
category = get_object_or_404(Category, slug=category_slug)
posts = get_list_or_404(Lessons.objects.order_by("-id"), category=category)
posts = helpers.pg_records(request, posts, 5)
context = {
'category': category,
'posts': posts
}
print(category)
return render(request, 'subcategory.html', context)
def post_by_tag(request, tag_slug):
tag = get_object_or_404(Tag, slug=tag_slug)
posts = get_list_or_404(Lessons.objects.order_by("-id"), tags=tag)
posts = helpers.pg_records(request, posts, 5)
context = {
'tag': tag,
'posts': posts
}
return render(request, 'post_by_tag.html', context )
def subcategory(request):
queryset = SubCategory.objects.all()
context = {
'object_lists': queryset
}
return render(request, 'subcategory.html', context)
def lesson(request, slug):
lesson = get_object_or_404(Lessons, slug=slug)
# Try to get the next & previous articles, using Django's incredible "get_next_by_FOO" function!!
try:
next_lesson = lesson.get_next_by_timestamp()
except Lessons.DoesNotExist:
next_lesson = None
try:
previous_lesson = lesson.get_previous_by_timestamp()
except Lessons.DoesNotExist:
previous_lesson = None
my urls.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from course.views import index, subcategory, post_by_category, post_by_tag
app_name = 'course'
urlpatterns = [
path('admin/', admin.site.urls),
path('', index, name='subcategory_detail'),
url(r'^category/(?P<category_slug>[\w-]+)/$', post_by_category, name='subcategory_detail'),
url(r'^tag/(?P<tag_slug>[\w-]+)/$', post_by_tag, name='post_by_tag'),
path('article/<slug>/', subcategory, name="subcategory-detail"),
]
my index.html
{% for article in object_list %}
<a href="{{ article.get_absolute_url }}" title="{{article.title}}">
{{ article.title }}
</a>
{% endfor %}
The problem is the value of your parameter:
'DEFAULT VALUE'
This is a string with a space between DEFAULT
and VALUE
. The url pattern [\w-]+
however does not allow spaces. It only allows alphanumerical characters and underscores ( [A-Za-z0-9]
).
You can extent the pattern to allow spaces:
url(r'^category/(?P<category_slug>+)/$', post_by_category, name='subcategory_detail'),
but it might be better to prevent the SlugField
to contain only [A-Za-z0-9_-]
characters. Django has a slugify(…)
function [Django-doc] for this.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.