请问如何在我的 url.py django 3 中使用 slug 创建 url?

Posted

技术标签:

【中文标题】请问如何在我的 url.py django 3 中使用 slug 创建 url?【英文标题】:Please how can I create url using slug in my url.py django 3? 【发布时间】:2021-12-04 09:11:58 【问题描述】:

很抱歉,我是 Django 的新手,遇到了一本名为“Tango with Django”1.9 版的书,但我正在用最新版本的 Django (即 3.2)编写我的代码。但是当我来到第 6 章时,我被卡住了,因为 slug。我尽我所能解决,但只是花了几个小时没有任何东西。 所以这是我想做的简要说明,我有一个名为 tango_with_django_project 的 django 项目,并且我创建了名为 rango 的新应用程序,因此在 mode.py 的 rango 应用程序中创建了包括 slug 在内的模型。我遇到的问题是,每当我在 urls.py 中编写路由时,它都会引发异常

 TypeError at /rango/category/other-frameworks/
无法解压不可迭代的 Category 对象
请求方法:GET
请求网址:http://127.0.0.1:8000/rango/category/other-frameworks/
Django 版本:3.2.7
异常类型:TypeError
异常值:
无法解压不可迭代的 Category 对象
异常位置:C:\Users\Userpc\code\env\lib\site-packages\django\db\models\sql\query.py,第 1283 行,在 build_filter
Python 可执行文件:C:\Users\Userpc\code\env\Scripts\python.exe
Python版本:3.8.5
Python 路径:
['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']
服务器时间:2021年10月16日星期六14:20:06 +0000

#我的网址.py from django.urls 导入路径 从范围导入视图

    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

【问题讨论】:

你能分享你的Page模型吗? @WillemVanOnsem 我刚刚分享了它 【参考方案1】:

您不能使用category 过滤pages = Page.objects.filter(<s>category</s>)。目前尚不清楚您将过滤页面的哪个字段,因此您需要指定链接到该类别的字段,并使用以下内容进行过滤:

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 &downarrow;
    return render(request, 'rango/category.html', context_dict)

【讨论】:

谢谢。但它也引发了另一个例外。 @YusufMuhammadZakar:新的例外是什么? @YusufMuhammadZakar:您应该将render(...) 放在 try-except 块之外。 它说 视图 rango.views.show_category 没有返回 HttpResponse 对象。它返回 None 。 @YusufMuhammadZakar:是的,我已经知道了,请参阅编辑后的答案。

以上是关于请问如何在我的 url.py django 3 中使用 slug 创建 url?的主要内容,如果未能解决你的问题,请参考以下文章

刷新 django 中的 urls.py 缓存

Django ListView 中当前用户对象的列表

如何理解 django url.py 中的 Url 模式

6)django-实例(fbv)

django-cms url 与 Slug at Root

Django URL路由分发系统