首页 > 解决方案 > “帖子匹配查询不存在。” 在 django 中导航到“管理页面”时出错?

问题描述

我正在学习 Django 并致力于制作一个简单的博客网站。现在整个项目工作正常,但是每当我导航到管理面板时,它都会显示错误“帖子匹配查询不存在。”。

让我知道您想查看代码的哪一部分(我很困惑哪个文件有错误)

错误 :

Environment:
Request Method: GET
Request URL: http://127.0.0.1:8000/admin

Django Version: 2.0.5
Python Version: 3.6.5
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'posts']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']

  Traceback:

File "C:\Users\Fruity_Dude\AppData\Local\Programs\Python\Python36\lib\site- 
  packages\django\core\handlers\exception.py" in inner
  35.             response = get_response(request)
File "C:\Users\Fruity_Dude\AppData\Local\Programs\Python\Python36\lib\site- 
  packages\django\core\handlers\base.py" in _get_response
  128.                 response = self.process_exception_by_middleware(e, 
  request)
File "C:\Users\Fruity_Dude\AppData\Local\Programs\Python\Python36\lib\site- 
  packages\django\core\handlers\base.py" in _get_response
  126.                 response = wrapped_callback(request, *callback_args, 
  **callback_kwargs)
File "C:\Users\Fruity_Dude\Projects\Django\devflow\posts\views.py" in 
  post_details
  10.   posts = Posts.objects.get(slug=slug)
File "C:\Users\Fruity_Dude\AppData\Local\Programs\Python\Python36\lib\site- 
  packages\django\db\models\manager.py" in manager_method
  82.                 return getattr(self.get_queryset(), name)(*args, 
  **kwargs)
File "C:\Users\Fruity_Dude\AppData\Local\Programs\Python\Python36\lib\site- 
  packages\django\db\models\query.py" in get
  403.                 self.model._meta.object_name
Exception Type: DoesNotExist at /admin
Exception Value: Posts matching query does not exist.

网址.py:

from django.urls import path
from . import views

app_name = 'posts'

urlpatterns = [
    path('', views.posts, name='home'),
    path('<slug:slug>', views.post_details, name='detail'),
]

视图.py:

from django.shortcuts import render
from .models import Posts
from django.http import HttpResponse

def posts(request):
    posts = Posts.objects.all().order_by('date')
    return render(request, 'posts/posts.html', {'posts': posts})

def post_details(request, slug):
    posts = Posts.objects.get(slug=slug)
    return render(request, 'posts/post_details.html', {'posts': posts})

主要urls.py

from django.contrib import admin
from django.urls import path,include
from . import views
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.conf.urls.static import static
from django.conf import settings

urlpatterns = [
    path('admin/', admin.site.urls), #for admin
    path('', include('posts.urls')),
    path('about/', views.about, name='about'), #for about
    path('contact/', views.contact, name='contact'), #for contact
    path('support/', views.support, name='support'), #for support
    path('donate/', views.donate, name='donate') #for donate
]

urlpatterns += staticfiles_urlpatterns()
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

标签: djangopython-3.x

解决方案


问题似乎是你正在运行

posts = Posts.objects.get(slug=slug)

和你的网址捕获

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

例如,当您执行http://domain:port/a-post/参数匹配的slug操作时'a-post/'(注意尾随/

你在评论中写道

url(r'^(?P<slug>[\w-]+)/$', views.post_details, name='detail')

解决了这个问题。这可能是因为尾随/现在不包含在结果slug变量中。

Posts.objects.get(slug=slug)由于.get- 方法需要匹配一行且只有一行,因此引发了错误。(见 django 文档

为避免该问题,我看到您应该实施两种解决方案。

  1. 将匹配更改为path('<slug:slug>/', views.post_details, name='detail'),即添加一个/.
  2. 使用过滤器方法。

例如:

posts = Posts.objects.filter(slug=slug).all()  # all() to make django perform the sql select command and return list
if not posts:
    # handle error case, either return 404 or redirect somewhere. 
elif len(posts) > 1:
    # handle the weird case when there was more than one matching post
post = posts[0]
# render using post instead of posts, since it is only one post

推荐阅读