簡體   English   中英

我如何在 Django 中正確使用 slug url?

[英]How do i use slug urls correctly in Django?

你好,我是 Django 的新手,我正在嘗試建立一個網站。 在管理頁面http://127.0.0.1:8000/admin/posts/post/我添加了兩個帖子,一個有一個 slug,**第一個 slug 是第一個,第二個是第二個問題是當我嘗試時到達http://127.0.0.1:8000/posts/firsthttp://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從不包含斜線。 看起來您的網址以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'),
]

添加路徑轉換器的類型可能會更好,因此< slug: slug>

您可能想使用django-autoslug [GitHub]來自動構建基於特定字段的 slug。

你先在這里犯了兩個錯誤>>>

#你還沒有關閉最后一個括號和逗號

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

你犯的第二個錯誤是你沒有定義 slug 類型,這是一個重要的點

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM