【问题标题】:Setting URL to use slug instead of ID将 URL 设置为使用 slug 而不是 ID
【发布时间】:2019-08-05 22:01:32
【问题描述】:

我希望我的 URL 在 django 中有 slug 而不是 post ID

这是我的 urls.py

from django.urls import path, re_path
from blog.views import( 
    blog_post_detail_view, 
    blog_post_list_view,
    blog_post_update_view,
    blog_post_delete_view,)

urlpatterns = [ 
    path('', blog_post_list_view),
    path('<str:slug>/', blog_post_detail_view),
    path('<str:slug>/edit/', blog_post_update_view),
    path('<str:slug>/delete/', blog_post_delete_view), ] 

    models.py

from django.shortcuts import render, get_object_or_404
from django.http import Http404
from .models import BlogPost


def blog_post_list_view(request):
    qs = BlogPost.objects.all()
    template_name = 'blog_post_list.html'
    context = {'object_list': qs}
    return render(request, template_name, context)


def blog_post_create_view(request):
    template_name = 'blog_post_create.html'
    context = {'form': None}
    return render(request, template_name, context)


def blog_post_detail_view(request, slug):
    obj = get_object_or_404(BlogPost, slug=slug)
    template_name = 'blog_post_detail.html'
    context = {"object": obj}
    return render(request, template_name, context)


def blog_post_update_view():
    obj = get_object_or_404(BlogPost, slug=slug)
    template_name = 'blog_post_update.html'
    context = {"object": obj, 'form': None}
    return render(request, template_name, context)

def blog_post_delete_view():
    obj = get_object_or_404(BlogPost, slug=slug)
    template_name = 'blog_post_delete.html'
    context = {"object": obj}
    return render(request, template_name, context

)

我希望 url 读取 http://127.0.0.1:8000/admin/blog/blogpost/i-need-this/change/ 而不是 http://127.0.0.1:8000/admin/blog/blogpost/3/change/

【问题讨论】:

    标签: django


    【解决方案1】:

    首先,您需要向模型添加 slug 字段,并通过以下方式为 post_details 模型创建绝对 url:

     class BlogPost(models.Model):
        slug = models.SlugField(null=True, max_length=40,unique_for_date='publish')
    
    
      from django.urls import reverse
    
        def get_absolute_url(self):
        return reverse('blog:post_details',args = [
            self.slug,
        ])
    

    'blog' 是你的应用名称,'post_details' 是你的views.py 文件中的细节视图函数 现在将您的应用名称包含到您的 urls.py 文件中

     app_name = 'your-app-name'
    

    更改详细信息视图的url路径

    path('<slug:post>/',views.post_details, name = 'post_details'),
    

    ':post' 是你的 finctions 参数。

    【讨论】:

    • 请您解释一下您所说的函数参数是什么意思
    • 这是您对帖子详细信息的看法,def blog_post_detail_view(request, slug):slug 是您的函数中的位置参数。我已将其作为帖子传递。您可以将其编辑为: def blog_post_detail_view(request, post): obj = get_object_or_404(BlogPost, slug=post) 然后 urls 路径应该是 ''
    • 好吧,它现在可以工作,但你的也可以。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 2019-05-11
    • 2015-01-31
    • 2013-04-22
    • 2021-09-05
    • 2010-10-03
    相关资源
    最近更新 更多