如何在 Django 中正确使用 slug url?

Posted

技术标签:

【中文标题】如何在 Django 中正确使用 slug url?【英文标题】:How do i use slug urls correctly in Django? 【发布时间】:2020-04-19 11:05:10 【问题描述】:

您好,我是 Django 新手,我正在尝试建立一个网站。 在管理页面http://127.0.0.1:8000/admin/posts/post/我添加了两个帖子,吃一个有一个蛞蝓,**第一个蛞蝓是第一个,第二个是第二个 问题是当我尝试联系http://127.0.0.1:8000/posts/first 或http://127.0.0.1:8000/posts/second 时,它给了我一个 404 错误,它告诉我**

使用 custom.urls 中定义的 URLconf,Django 尝试了这些 URL 模式,按以下顺序:

admin/
posts/ [name='posts_list']
<slug>

当前路径,posts/first,与其中任何一个都不匹配。

这是models.py

from django.db import models
from django.conf import settings
Create your models here.

User = settings.AUTH_USER_MODEL

class Author(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    email = models.EmailField()
    phone_num = models.IntegerField(("Phone number"))

    def __str__(self):
       return self.user.username

class Post(models.Model):
    title = models.CharField(max_length=120)
    description = models.TextField()
    slug = models.SlugField()
    image = models.ImageField()
    author = models.OneToOneField(Author, on_delete=models.CASCADE)


    def __str__(self):
        return self.title

这是views.py

from django.shortcuts import render, get_object_or_404
from .models import Post
# Create your views here.


def posts_list(request):
    all_posts = Post.objects.all()
    return render(request, 
                  "posts/posts_list.html", 
                  context = "all_posts": all_posts)


def posts_detail(request, slug):
    unique_slug = get_object_or_404(Post, slug = slug)

    return render(request, "posts/posts_detail.html", "post": unique_slug)

这是 urls.py

from django.contrib import admin
from django.urls import path
from posts.views import posts_list, posts_detail
urlpatterns = [
        path('admin/', admin.site.urls),
        path("posts/", posts_list, name = "posts_list"),
        path("<slug>", posts_detail), #, name = "unique_slug"
    ]

这就是模板: posts_list.html

<!DOCTYPE html>
<html>
    <head>
        <title>
        </title>
    </head>
    <body>
         all_posts 
    </body>
</html>

post_detail.html

<!DOCTYPE html>
<html>
    <head>
        <title>
        </title>
    </head>
    <body>
         post 
    </body>
</html>

【问题讨论】:

slug 不包含斜线。 【参考方案1】:

slug 从不包含斜杠。看起来您的网址以 posts/ 为前缀。所以你可以改变你的urls.py

from django.contrib import admin
from django.urls import path
from posts.views import posts_list, posts_detail

urlpatterns = [
    path('admin/', admin.site.urls),
    path('posts/', posts_list, name='posts_list'),
    path('posts/<slug:slug>/', posts_detail, name='unique_slug'),
]

最好加上路径转换器的类型,所以&lt;<b>slug:</b>slug&gt;

您可能希望使用django-autoslug [GitHub] 自动构建基于某个字段的 slug。

【讨论】:

问题是我正在学习 youtube 课程,而他使用的是旧版本的 Django。 我不确定你是否应该指定类型,在我看来用 就足够了 @MarioRojas: 但它是str,而str 可以包含例如空格、带有变音符号的字符等。准确定义了一个 slug 以使 URL 参数看起来“漂亮” )。【参考方案2】:

你先在这里犯了两个错误>>>

#你还没有用逗号关闭最后一个括号

path("<slug>", posts_detail), #, name = "unique_slug"__<<

您犯的第二个错误是您没有定义重要的 slug 类型

【讨论】:

以上是关于如何在 Django 中正确使用 slug url?的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在 Django 中使用反向工作来制作 *** 样式的 URL,以允许 slug 更改?

Django中的Slug Url正则表达式

Django REST - 如何正确配置 URL 查找字段?

如何在 django 中的所有 url 使用 slug 之前或之后没有任何内容?

Django:如果 slug 错误,则重定向 url