系统信息:使用Sublime Text 3.1.1和Mac 10.14 Mojave和Django版本2.1.3
我正在Django中为Python创建博客。它有一个主页,然后有一个“帖子”页面,当您单击它时,它会列出已创建的帖子的标题。当我单击帖子标题时,它将带我到一个页面,该页面上包含标题,然后是帖子下方的文本。但是,这是我的项目停止工作的地方。我在网络浏览器上收到错误:
TypeError at /posts/1/
post() got an unexpected keyword argument 'post_id'
Request Method: GET
我正在尝试使用一个数字来表示与博客文章相对应的网址。因此,一篇博客文章位于http://localhost:8000/posts/1/,下一篇博客文章位于http://localhost:8000/posts/2/,依此类推。让我向您展示我如何尝试做到这一点。
在我的urls.py中,我在“ urlpatterns”列表中创建以下路径:
path('posts/<int:post_id>/',views.post,name='post')
。据我了解,这应该将一个整数值存储为“ post_id”。
我在“ views.py”中对某条帖子的看法如下:
from django.shortcuts import render
from .models import BlogPost as Post
def post(request):
"""Show the text of a single blog post"""
post=Post.objects.get(id=post_id)
context = {'post':post}
return render(request,'blogs/post.html',context)
作为参考,我的'models.py'看起来像:(当然,导入了适当的东西)
class BlogPost(models.Model):
"""A blog post"""
title=models.CharField(max_length=200)
text=models.TextField()
date_added=models.DateTimeField(auto_now_add=True)
def __str__(self):
"""Return a string representation of the model"""
return self.text
我的帖子模板来自一个非常基本的“ base.html”,看起来像:
{% extends 'blogs/base.html' %}
{% block content %}
<p>{{ post.title }}</p>
<p>{{ post.text }}</p>
{% endblock content %}
</pre>
此模板也链接到我的模板“ posts.html”:
{% extends "blogs/base.html" %}
{% block content %}
<p>Posts</p>
<ul>
{% for post in posts %}
<li>
<a href="{% url 'blogs:post' post.id %}">{{ post.title }}</a>
</li>
{% empty %}
<li>No posts have been submitted yet</li>
{% endfor %}
</ul>
{% endblock content %}
最重要的一行是带有“ post.id”的那一行,因为这可能是我搞砸的地方。
我相信这个问题与不接受关键字参数有关,但是我很难理解Django的错误消息。
答案 0 :(得分:4)
由于您的网址格式包含<int:post_id>
,因此您的函数定义必须接受post_id
。更改为:
def post(request, post_id):
答案 1 :(得分:1)
您忘记将post_id添加到帖子视图中
def post(request,post_id):
"""Show the text of a single blog post"""
post=Post.objects.get(id=post_id)
context = {'post':post}
return render(request,'blogs/post.html',context)
答案 2 :(得分:0)
尝试在urls参数中仅传递pk而不是post_id,这有点奇怪
path('posts/<int:pk>/',views.post,name='post')