Django访问文章详情报错:postdetail() got an unexpected keyword argument 'post'
报错
postdetail() got an unexpected keyword argument 'post'解决方案 错误原因
该报错是两个问题共同导致的:
- URL路由中捕获的参数名和视图函数定义的接收参数名不匹配
- 视图函数中查询单篇文章的方法和参数使用错误
具体修改步骤
1. 修正views.py代码
首先调整视图函数的参数名,同时替换正确的单对象查询方法:
# 首先修改导入,把get_list_or_404换成get_object_or_404(查询单篇文章不需要返回列表) from django.shortcuts import render, get_object_or_404 from django.http import HttpResponse from django.urls.base import reverse from django.urls.converters import SlugConverter from .models import post def index(request): tpost = post.objects.all() return HttpResponse("Welcome to the django website") def postlist(request): tpost = post.objects.filter(status = "published") return render(request, "blog/post/list.html", {"posts": tpost}) # 把参数npost改成post,和URL中定义的参数名对应 def postdetail(request, post, pk): # 第一个参数传模型类post,筛选条件slug对应传入的post参数,id对应pk参数 fpost = get_object_or_404(post, slug = post, id = pk) return render(request, "blog/post/detail.html", {"fpost": fpost})
补充:如果你不想修改视图函数的参数名,也可以选择修改urls.py中的参数名,把
<slug:post>改成<slug:npost>即可,两种方案二选一即可。
2. (可选)优化命名规范
Python的类名默认遵循大驼峰命名规则,建议把你的模型类名从post改成Post,避免和变量名冲突,修改后需要同步调整视图中所有调用模型的地方。
内容的提问来源于stack exchange,提问作者Mahdi Ferdosi
相关产品推荐
相关产品推荐

