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

标签 python html django url slug

您好,我是 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 错误,它告诉我**

Using the URLconf defined in custom.urls, Django tried these URL patterns, in this order:

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

The current path, posts/first, didn't match any of these.

这是 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从不包含斜线。您的网址似乎带有 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(<b>'posts/<slug:slug>/'</b>, posts_detail, name='unique_slug'),
]

最好添加路径转换器的类型,因此 <<b>slug:</b>slug> .

您可能想使用 django-autoslug [GitHub]根据特定字段自动构建 slug。

关于python - 如何在 Django 中正确使用 slug url?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59535275/

相关文章:

php - 发送邮件时缺少 <img> 的 src 属性

django - 模板语法错误 : Caught ImportError while rendering: cannot import name utils

python - Django - 在views.py内部使用我自己的REST API的正确方法?

python - 从列表中创建一个新列表但没有重复项?

python - MacOS 10.8.4 安装 lxml 失败

html - Google Web 字体在特定计算机上呈现像素化

java - 用 HTML 标签解析 CDATA 并获取内容

django - django-allauth 发送电子邮件时电子邮件主题行中的 "[Site]"

python - QSpacerItem 实例化两次时使 pyQT 崩溃

python - 动态创建子类的类型注解