我正在使用 Django 开发一个网站,需要在 URL 中使用 slugs。当我使用 ids 时,一切正常。
我已完成以下步骤:
class Post(models.Model):
title = models.CharField(max_length=100)
slug = models.SlugField(max_length=100, unique=True, default='')
content = models.TextField()
category = models.ForeignKey(Category, on_delete=models.CASCADE, null=True, blank=True)
photo = models.ImageField(upload_to='post_photos/', blank=True) # ImageField для хранения изображений
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
is_published = models.BooleanField(default=False)
def __str__(self):
return self.title
def save(self, *args, **kwargs):
if not self.photo: # Если поле photo пустое, генерируем случайный путь к изображению
random_image_path = get_random_image_path()
self.photo = random_image_path # Привязываем случайное изображение к объекту Post
super().save(*args, **kwargs)
def get_absolute_url(self):
return reverse('post', kwargs={'post_slug': self.slug})
urls.py
和views.py
应用程序
urls.py
:
path('fitness/<slug:post_slug>/', views.show_post, name='post'),
项目
urls.py
:
from django.contrib import admin
from django.urls import path
from immuno2you import views
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.index, name='index'),
path('healthy-nutrition/', views.nutrition, name='nutrition'),
path('fitness/', views.fitness, name='fitness'),
path('fitness/<slug:post_slug>/', views.show_post, name='post'),
def show_post(request, post_slug):
post = get_object_or_404(Post, slug=post_slug)
return render(request, 'show_post.html', {'post': post})
这效果很好。
但是,当我尝试进行一些修改以使用这些段时:
def get_absolute_url(self):
return reverse('post', kwargs={'post_slug': self.slug})
def show_post(request, post_slug):
post = get_object_or_404(Post, slug=post_slug, category__slug='fitness')
return render(request, 'show_post.html', {'post': post})
我收到以下错误:
找不到页面(404)
“/home/tkzeujpw/blog/fitness/fitness-post-1”不存在
请求方式:GET
请求网址:http://example.com/fitness/fitness-post-1
提出者:django.views.static.serve使用 example.urls 中定义的 URLconf,Django 按>此顺序尝试了这些 URL 模式:
管理员/
[名称='索引']
健康营养/ [名称='营养']
健身/ [名称='健身']
健身/slug:post_slug/ [name='post']
^(?P.*)$当前路径,fitness/fitness-post-1,与最后一条匹配。
您看到此错误是因为您的 Django 设置文件中有 DEBUG = True。将其更改为 False,Django 将显示标准的 404 页面。
我唯一更改的是
self.pk
参数为 self.slug
。
找不到页面(404)
“/home/tkzeujpw/blog/fitness/fitness-post-1”不存在
请求方式:GET 请求网址:http://example.com/fitness/fitness-post-1
您正在向端点发出不带尾部斜杠的请求
/
。
默认在 django 中
如果请求 URL 与 URLconf 中的任何模式都不匹配并且不以斜杠结尾,则会向同一 URL 发出 HTTP 重定向,并附加斜杠。
但是可以通过将
APPEND_SLASH
设置为 False
来禁用此默认行为。这可能是您问题的原因。
确保其设置为
True
。