Пожалуйста, как я могу создать url, используя slug в моем url.py django 3?

Прошу прощения за долгое объяснение Я новичок в Django и наткнулся на книгу под названием "Tango with Django" версии 1.9, но я кодирую свой в последней версии Django, т.е. 3.2. Но когда я дошел до главы 6, я застрял из-за slug. Я пытался решить эту проблему изо всех сил, но просто провел несколько часов безрезультатно. Вот краткое описание того, что я хочу сделать: у меня есть проект django под названием tango_with_django_project, и я создал новое приложение под названием rango, и внутри приложения rango в mode.py я создал свои модели, включая slug. Проблема заключается в том, что всякий раз, когда я прописываю маршрут в urls.py, возникает исключение в виде

 TypeError at /rango/category/other-frameworks/
cannot unpack non-iterable Category object
Request Method: GET
Request URL:    http://127.0.0.1:8000/rango/category/other-frameworks/
Django Version: 3.2.7
Exception Type: TypeError
Exception Value:
cannot unpack non-iterable Category object Exception Location: C:\Users\Userpc\code\env\lib\site-packages\django\db\models\sql\query.py, line 1283, in build_filter Python Executable: C:\Users\Userpc\code\env\Scripts\python.exe Python Version: 3.8.5 Python Path:
['C:\Users\Userpc\code\tango_with_django_project', 'C:\Program Files (x86)\Python38-32\python38.zip', 'C:\Program Files (x86)\Python38-32\DLLs', 'C:\Program Files (x86)\Python38-32\lib', 'C:\Program Files (x86)\Python38-32', 'C:\Users\Userpc\code\env', 'C:\Users\Userpc\code\env\lib\site-packages'] Server time: Sat, 16 Oct 2021 14:20:06 +0000

#my urls.py from django.urls import path from rango import views

    urlpatterns = [
        path('', views.index, name='index'),
        path('about/', views.about),
        path('index/', views.index),
        path('category/<slug:category_name_slug>/',views.show_category, name='show_category'),
    ]

 



   
   

    #views.py
    from django.shortcuts import render
    from rango.models import Category, Page
    from rango.models import Page
    
    
    def show_category(request, category_name_slug):
        context_dict = {}
    
        try:
            category = Category.objects.get(slug=category_name_slug)
            pages = Page.objects.filter(category)
    
            context_dict['pages'] = pages
            context_dict['category'] = category
        except Category.DoesNotExist:
            context_dict['category'] = None
            context_dict['pages'] = None
            
            return render(request, 'rango/category.html', context_dict)
    
    def index(request):
        category_list = Category.objects.order_by('-likes')[:5]
        context_dict = {'categories': category_list}
        return render(request, 'rango/index.html', context=context_dict)  
    
    
    def about(request):
        context_dict = {'mss': "This tutorial has been put together by Yusuf"}
        return render(request,'rango/about.html', context=context_dict)
   
    
   <!DOCTYPE html>
<html>
<head>
        <title>Rango</title>
</head>
<body>
    <div>
        {% if category %}
          <h1>{{ category.name }}</h1>
            {% if pages %}
                  <ul>
                   {% for page in pages %}
                      <li><a href="{{ page.url }}">{{ page.title }}</a></li>
                   {% endfor %}
                   </ul>
                {% else %}
                   <strong> No pages curently in category.</strong>
                {% endif %}
        {% else %}
            The specified category does not exist!
        {% endif %}
    </div>
</body>
</html>


#MODEL.PY

from django.db import models
from django.template.defaultfilters import slugify

class Category(models.Model):
    name = models.CharField(max_length=128,unique=True)
    views = models.IntegerField(default=0)
    likes = models.IntegerField(default=0)
    slug = models.SlugField(null=True)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        super(Category, self).save(*args, **kwargs)
        

    class Meta:
        verbose_name_plural = 'categories'
        


    def __str__(self):
        return self.name


class Page(models.Model):
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    title = models.CharField(max_length=128)
    url = models.URLField()
    views = models.IntegerField(default=0)
    likes = models.IntegerField(default=0)

    def __str__(self):
        return self.title

Вы не можете использовать category для фильтрации в pages = Page.objects.filter(category). Неясно, по какому полю вы будете фильтровать страницу, поэтому необходимо указать поле, которое ссылается на категорию, и фильтровать с помощью:

category = Category.objects.get(slug=category_name_slug)
pages = Page.objects.filter(category=category)

В вашем представлении вы должны отобразить страницу вне блока try-except, так:

def show_category(request, category_name_slug):
    context_dict = {}
    try:
        category = Category.objects.get(slug=category_name_slug)
        pages = Page.objects.filter(category=category)
        context_dict['pages'] = pages
        context_dict['category'] = category
    except Category.DoesNotExist:
        context_dict['category'] = None
        context_dict['pages'] = None
    # outside the try-except ↓
    return render(request, 'rango/category.html', context_dict)
Вернуться на верх