简体   繁体   中英

How to Fix no reverse match with argument in django

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM