【问题标题】:Django can't find my DetailView with Primary KeyDjango 用主键找不到我的 DetailView
【发布时间】:2022-01-16 07:46:09
【问题描述】:

我正在尝试使用 Django 创建一个简单的页面,其中使用主键显示帖子。但是,无法显示包含我的帖子的 DetailView 页面。

这是我的模型:

class Post(models.Model):
author = models.CharField(max_length=100)
title = models.CharField(max_length=100)
posted_date = timezone.now()
text = models.TextField()

def get_absolute_url(self):
    return reverse("postdetail", kwargs={"pk": self.pk})

def __str__(self):
    return self.title

这是我的 url 模式列表:

urlpatterns = [
url(r'^posts/(?P<pk>\d+)$', views.PostDetail.as_view(), name="postdetail"), 
url(r'^$', views.index, name="index"), 
url(r'^thanks/$', views.Thanks.as_view(), name="thanks"), 
url(r'^postlist/$', views.PostList.as_view(), name="postlist"), 
]

模板位于我的模板文件夹中,名为“post_detail.html”。

这里是详细视图:

class PostDetail(DetailView):
context_object_name = 'post_details'
model = Post

我看不出哪里可能有错误。我有一个 ListView 显示我的帖子,包括主键。但是当我尝试打开 URL http://127.0.0.1:8000/posts/1/ 我明白了:

`Page not found (404)
Request Method: GET
Request URL:    http://127.0.0.1:8000/posts/1/
Using the URLconf defined in myproj.urls, Django tried these URL patterns, in this order:

admin/
^posts/(?P<pk>\d+)$ [name='postdetail']
^$ [name='index']
^thanks/$ [name='thanks']
^postlist/$ [name='postlist']
The current path, posts/1/, didn’t match any of these.

您知道为什么找不到 URL 吗?非常感谢。`

【问题讨论】:

    标签: django django-templates


    【解决方案1】:

    path()代替url()

    from django.urls import path
    
    urlpatterns = [
        path('', views.index, name = "index"),
        path('posts/<int:pk>', views.PostDetail.as_view(), name = "postdetail"),
        path('postlist/', views.PostList.as_view(), name="postlist"),
        path('thanks', views.Thanks.as_view(), name = "thanks"),
    ]
    

    注意:url() 自 3.1 版起已弃用并在 4.0 版中删除

    【讨论】:

    • 嗨,谢谢,我正在使用 Django3。不幸的是,这并没有解决问题。
    • 有任何错误吗?您现在面临的问题是什么?
    【解决方案2】:

    您正在尝试访问:http://127.0.0.1:8000/posts/1/,当您定义以下 http://127.0.0.1:8000/posts/1 时没有反冲。

    试试看:http://127.0.0.1:8000/posts/1

    【讨论】:

    • 嗨 Gaëtan GR,感谢您的建议。但是,我的浏览器会自动在末尾添加“/”,即使我没有包含它。
    • 因为通常它除了有点约定的“/”之外,在路径末尾使用“/”编辑路径,如下所示:r'^posts/(?P \d+)$/'
    • * r'^posts/(?P\d+)/$' 甚至可能是 r'^posts/(?P\d+)/?$' 因为这应该两者都接受
    【解决方案3】:

    首先是您的观点。您可以发送数据库数据并将其返回到 HTML。

    views.py

    def post(request,id):
        post = Post.objects.get(id=id)
        return render(request,'blog/index.html',{'post':post})
    

    在将数据发送到 HTML 之前,您应该在 urls.py 中获取帖子 ID

    urls.py

        path('post/<int:id>', views.post, name='post.blog')
    

    然后在您的 HTML 中,您可以处理来自您的 views.py 的数据

    index.html

    <div class="post-content content">{{ post.body|safe }}</div>
    

    【讨论】:

    • 您是否正确阅读了问题?问题与语法有关,为什么要谈论数据库?他也使用基于类的视图而不是基于函数的视图,最后他不能使用路径方法...
    • 嗨阿里,谢谢我尝试了你的建议,但我得到了同样的错误。
    • @tobbog- 你的问题是什么
    猜你喜欢
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 2014-11-27
    • 2017-07-27
    • 2022-01-15
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多