Django Страница не найдена (404) при фильтрации услуг по категориям с помощью урлов

Я учусь использовать url в Django и у меня возникла проблема. Я пытаюсь получить все услуги, принадлежащие категории, щелкнув на ссылке категории, но когда я это делаю, браузер возвращает мне эту ошибку:

Page not found (404)
   Request Method:  GET
      Request URL:  http://localhost:8000/services/None
         Raised by: services_app.views.service_list
No Category matches the given query.

А url выглядит так:

http://localhost:8000/services/None

У меня уже есть заполненная база данных, и она может отображать их содержимое просто используя djanfo for, но мне нужно, чтобы оно отображалось по категориям. Кто-нибудь может мне помочь?

Вот мои файлы:

home_app/models.py

from django.db import models
from django.urls import  reverse

class Category(models.Model):
    name=models.CharField(primary_key=True, max_length=50)
    slug=models.SlugField(unique=True, blank=True, null=True)
    image=models.ImageField(upload_to='category_home')
    description=models.CharField(max_length=100)
    content=models.TextField(max_length=500, default="Service")
    created=models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name = 'Category'
        verbose_name_plural = 'Categories'

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('services_by_category', args=[self.slug])

services_app/models.py

from django.db import models
from home_app.models import Category

class Services(models.Model):
    category=models.ForeignKey(Category, on_delete=models.CASCADE)
    title=models.CharField(max_length=50)
    completed=models.DateField(auto_now_add=False, null=True, blank=True)
    content=models.CharField(max_length=50, null=True, blank=True)
    image=models.ImageField(upload_to='services_services')
    created=models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name = 'Service'
        verbose_name_plural = 'Services'
    
    def __str__(self):
        return '%s de %s' % (self.category, self.title)

services_app/views.py

from django.shortcuts import render, get_object_or_404
from .models import Services
from home_app.models import Category

def service_list(request,category_slug=None):
    category = None
    categories = Category.objects.all()
    services = Services.objects.all()
    if category_slug:
        category = get_object_or_404(Category,slug=category_slug)
        services = services.filter(category=category)
    return render(request, 'services_app/services.html', {'categories':categories, 'category':category, 'services':services,})

services_app/urls.py

from django.urls import path
from services_app import views

urlpatterns = [
    path('', views.service_list, name='Services'),
    path('<slug:category_slug>', views.service_list, name='services_by_category'),
]

services_app/templates/services_app/services.html

{% extends "home_app/base.html" %}
{% load static %}
{% block content %}

<div id="sidebar">
    <br>
    <br>
    <h3>Categories</h3>
        <ul>
        {% for c in categories %}
            <li>
           <h4><a href="{{ c.get_absolute_url }}">{{ c.name }}</a></h4>
            </li>
        {% endfor %}
        </ul>
</div><br>
<div>
    <h1>{% if category %}{{ category.name }}{% endif %}</h1>
    {% for service in services %}
        <img src="{{service.image.url}}">
    {% endfor %}
</div>

{% endblock %}

Также мои основные ссылки:

from django.contrib import admin
from django.urls import path, include


urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('home_app.urls')),
    path('services/', include('services_app.urls')),
    path('contact/', include('contact_app.urls')),
]

Проблема заключается в том, что вы не генерируете slug из Category:

from django.db import models
from django.urls import  reverse
from django.utils.text import slugify

class Category(models.Model):
    name=models.CharField(primary_key=True, max_length=50)
    slug=models.SlugField(unique=True, blank=True, null=True)
    image=models.ImageField(upload_to='category_home')
    description=models.CharField(max_length=100)
    content=models.TextField(max_length=500, default="Service")
    created=models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name = 'Category'
        verbose_name_plural = 'Categories'
 
    def save(self, *args, **kwargs):
        if self._state.adding:
            self.slug = slugify(self.name)
        super().save(*args, **kwargs)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('services_by_category', args=[self.slug])

Обратите внимание, что вам нужно вручную установить slug для существующих экземпляров Category (с помощью администратора, оболочки или миграции), или вы можете просто создать их заново.

Вернуться на верх