我如何在 Django 中正确使用 slug url?
How do i use slug urls correctly in Django?
你好,我是 Django 的新手,我正在尝试建立一个网站。
在管理页面 http://127.0.0.1:8000/admin/posts/post/ 我添加了两个帖子,发现一个有鼻涕虫,**第一个鼻涕虫是第一个,第二个是第二个
问题是当我尝试到达 http://127.0.0.1:8000/posts/first or 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>
A slug
从不包含斜杠。看起来您的 url 带有 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。
你这里先犯了两个错误>>>
#你还没有用逗号关闭最后一个括号
path("<slug>", posts_detail), #, name = "unique_slug"__<<
你犯的第二个错误是你没有定义 slug 类型,这一点很重要
你好,我是 Django 的新手,我正在尝试建立一个网站。 在管理页面 http://127.0.0.1:8000/admin/posts/post/ 我添加了两个帖子,发现一个有鼻涕虫,**第一个鼻涕虫是第一个,第二个是第二个 问题是当我尝试到达 http://127.0.0.1:8000/posts/first or 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>
A slug
从不包含斜杠。看起来您的 url 带有 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。
你这里先犯了两个错误>>>
#你还没有用逗号关闭最后一个括号
path("<slug>", posts_detail), #, name = "unique_slug"__<<
你犯的第二个错误是你没有定义 slug 类型,这一点很重要