尝试在 Django 中使用 slugs 时出现 404 错误

问题描述 投票:0回答:1

我正在使用 Django 开发一个网站,需要在 URL 中使用 slugs。当我使用 ids 时,一切正常。

我已完成以下步骤:

  1. 我有一个模特帖子:
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})
  1. 我在我的
    urls.py
    views.py
  2. 中写了以下内容

应用程序

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

django slug
1个回答
0
投票

找不到页面(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

© www.soinside.com 2019 - 2024. All rights reserved.