cats() 收到意外的关键字参数 'pk

1 投票
1 回答
746 浏览
提问于 2025-04-18 15:01

我是一名业余的Django网页开发者。我在使用Django时遇到了一个问题。错误信息是“cats() 收到了一个意外的关键字参数 'pk'”。请看看我的代码,帮帮我。

Request Method: GET
Request URL:    http://127.0.0.1:8000/1
Django Version: 1.6.5
Exception Type: TypeError
Exception Value:    
cats() got an unexpected keyword argument 'pk'
Exception Location: /usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py in get_response, line 112
Python Executable:  /usr/bin/python
Python Version: 2.7.6 

models.py

from django.db import models
from taggit.managers import TaggableManager

class Category(models.Model):
    title = models.CharField(max_length=40)
    def __unicode__(self):
        return self.title

class Post (models.Model):
    title = models.CharField(max_length=150)
    body = models.TextField()
    date = models.DateTimeField()
    tags = TaggableManager ()
    cats = models.ManyToManyField(Category)
    def __unicode__ (self):
        return self.title

urls.py

from django.conf.urls import include, url, patterns
from django.views.generic import ListView, DetailView
from blog.models import Post, Category

urlpatterns = patterns('blog.views',
    url(r'^$',ListView.as_view(
        queryset = Post.objects.all().order_by("-date")[:2],
        template_name="index.html")),       
    url(r'^(?P<pk>\d+)$', 'cats', name='cats'),

)

views.py

from blog.models import Post,Category
from django.shortcuts import render_to_response
from django.template import RequestContext

def cats(request):
    queryset = Post.objects.all().order_by("-date")
    navitem = Category.objects.all().order_by("title")
    return render_to_response('post.html',{'queryset':queryset,'navitem':navitem},context_instance=RequestContext(request))

1 个回答

1

问题出在urls.py的这一行:

url(r'^(?P<pk>\d+)$', 'cats', name='cats')

你传给视图的一个参数其实是多余的,它并不需要这个参数。

你可以把pk这个参数加到视图的参数列表里,像这样:

def cats(request, pk):

或者这样:

def cats(request, pk=None):

更好的方法是,你可以在URL中使用不同的模式,不用去捕获这个参数(因为在你的视图中根本不需要用到这个pk值,所以也就不需要为它创建一个变量),像这样:

url(r'^(\d+)$', 'cats', name='cats')

撰写回答