在Django上创建博客-URL无法配合

时间:2018-11-26 21:07:36

标签: python django web

系统信息:使用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的错误消息。

3 个答案:

答案 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')