首页 > 解决方案 > /blog/21-detail() 的 TypeError 得到了一个意外的关键字参数“blog_id”

问题描述

我正在为我的项目制作一个工具。我的最终目标是当我在new.html页面中键入标题、正文时,它会运行并最终从页面create.html中获取所有信息。我创建了两个应用程序,(写作作品)和(登录作品),但我收到此错误并且找不到任何解决方案:new.htmldetail.htmlGoodAccount

detail() 得到了一个意外的关键字参数“blog_id”

我在 Visual Studio Code 中运行它,现在我正在尝试插入:

def detail(request):
    details = get_object(Good, pk= blog_id)
    return render(request, 'detail.html', {'details':details})

如果它是正确的,我该怎么办?

主页.html

{% extends 'base.html' %}
{% block contents %}
<body>
</body>
{% endblock %}

网址.py

from django.contrib import admin
from django.urls import path
import good.views
import account.views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', good.views.home, name="home"),
    path('login/', account.views.login, name="login"),
    path('signup/', account.views.signup, name="signup"),
    path('new/', good.views.new, name="new"),
    path('create/', good.views.create, name="create"),
    path('blog/<int:blog_id>', good.views.detail, name="detail"),
]

模型.py

from django.db import models

class Good(models.Model):
    title = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    body = models.TextField()

    def __str__(self):
        return self.title

管理员.py

from django.contrib import admin
from .models import Good

admin.site.register(Good)

视图.py

from django.shortcuts import render, get_object_or_404, redirect
from .models import Good
from django.utils import timezone

def home(request):
    return render(request,'home.html')

def new(request):
    return render(request, 'new.html')

def create(request):
    blog = Good()
    blog.title = request.GET['title']
    blog.body = request.GET['body']
    blog.pub_date = timezone.datetime.now()
    blog.save()
    return redirect('/blog/' + str(blog.id))    

def detail(request):
    blogs = Good.objects
    return render(request, 'detail.html', {'blogs':blogs}) 

新的.html

{% extends 'base.html' %}
{% block contents %}
<body>
<br>
<div class="container">
<form action="{% url 'create' %}">
  <h4>title: </h4>
  <input type="text" name="title">
  <br>
  <br>
  <h4>body: </h4>
  <textarea cols=40 rows=10 name="body"></textarea>
  <br>
  <br>
  <input class="btn btn-dark" type="submit" value="submit">
</div>
</body>
{% endblock %}

详细信息.html

{% extends 'base.html' %}
{% block contents %}
<body>
{% for blog in blogs.all %}
<div class="container">
    <h1>{{ blog.title }}</h1>
    <p>{{ blog.pub_date }}</p>
    <p>{{ blog.body }}</p>
</div>
{% endfor %}
</body>
{% endblock %}

标签: pythondjango

解决方案


您必须将blog_idas 参数传递给 detail 函数,如下所示:

编辑: 如果您想在详细信息页面中显示所有对象,那么您可以这样做:

def detail(request,blog_id):
    all_objects = Good.objects.all()
    details = get_object_or_404(Good, pk= blog_id)
    return render(request, 'detail.html', {'details':details,'all_objects':all_objects})

现在在模板中,您不需要使用 for 循环来获取详细信息,因为您正在尝试仅获取某个特定 id 的详细信息。

例如,您可以像这样获取该特定 id 的详细信息:

{% extends 'base.html' %}
{% block contents %}
<body>
<div class="container">
    <h1>{{ details.title }}</h1>
    <p>{{ details.pub_date }}</p>
    <p>{{ details.body }}</p>
</div>
</body>


# To get all the objects in your template try this:

{% for object in all_objects %}
<p>{{object.title}}</p>
<p>{{obj.pub_date}}<.p>
{% endfor %}
{% endblock %}

推荐阅读