Django TypeError get_object_or_404() 至少需要 1 个参数(给定 0 个)
我正在做一个博客,并且在学习django的过程中遇到了一些问题。我想把网址设置成既包含文章的别名(slug)又包含文章的ID。
当我在管理面板点击“在网站上查看”链接时,出现了这个错误: NoReverseMatch at /admin/r/7/2/ 找不到名为'article'的反向链接,参数是'(u'test-post-3', '2')',没有找到对应的模式。尝试了0个模式。
当我手动输入网址时,出现了这个错误: TypeError at /articles/test-post-3,2/ get_object_or_404() 至少需要1个参数(给了0个) 这是我的代码:
views.py:
from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse, HttpResponseRedirect
from django.template import RequestContext, loader
from django.core.urlresolvers import reverse
from django.views import generic
from django.utils import timezone
# Create your views here.
from articles.models import Content
class IndexView(generic.ListView):
template_name = 'articles/index.html'
context_object_name = 'latest_articles_list'
def get_queryset(self):
return Content.objects.filter(
published_date__lte=timezone.now()
).order_by('-published_date')[:5]
def detail(request, slugline, id):
article = get_object_or_404(pk=id)
return render(request, 'articles/detail.html', {'article': article})
urls.py:
from django.conf.urls import patterns, url
from articles import views
urlpatterns = patterns('',
url(r'^$', views.IndexView.as_view(), name = 'index'),
#url(r'^(?P<slugline>[-\w\d]+), (?P<pk>\d+)/$', views.DetailView.as_view(), name='detail')
url(r'^(?P<slugline>[-\w\d]+),(?P<id>\d+)/$', view=views.detail, name='article'),
)
models.py:
from django.db import models
from django.db.models import permalink
from django.utils import timezone
import datetime
# Create your models here.
class Content(models.Model):
title = models.CharField(max_length=100, unique=True)
slugline = models.SlugField(max_length=100, unique=True)
body = models.TextField()
published_date = models.DateTimeField('date published')
def __unicode__(self):
return self.title
@permalink
def get_absolute_url(self):
# return ('article', (), {
# 'slugline': self.slugline,
# 'id': self.id,
# })
from django.core.urlresolvers import reverse
return reverse('article', args=[self.slugline, str(self.id)])
def was_published_recently(self):
now = timezone.now()
return now - datetime.timedelta(days=1) <= self.published_date <= now
was_published_recently.admin_order_field = 'published_date'
was_published_recently.boolean = True
was_published_recently.short_description = 'Published recently?'
主urls.py:
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
# Examples:
# url(r'^$', 'the_Bluntist.views.home', name='home'),
# url(r'^blog/', include('blog.urls')),
url(r'^articles/', include('articles.urls', namespace="articles")),
url(r'^admin/', include(admin.site.urls)),
)
2 个回答
0
article = get_object_or_404(pk=id)
你必须同时传入模型和过滤器才能进行调用。这里有相关文档。
article = get_object_or_404(klass, pk=id)
2
你对 get_object_or_404
的使用不太正确:
文档说明:
get_object_or_404(klass, *args, **kwargs)
这个函数会用get()
来返回一个对象,如果找不到这个对象,就会抛出一个Http404
异常,表示页面不存在。
klass
可以是一个Model
(模型)、Manager
(管理器)或者QuerySet
(查询集)对象。其他传入的参数和关键字参数会用于get()
查询。
注意:如果找到多个对象,就会抛出MultipleObjectsReturned
异常。
你可以这样使用:
article = get_object_or_404(Article, pk=id)
article = get_object_or_404(Article.objects, pk=id)
article = get_object_or_404(Article.objects.all(), pk=id)
article = get_object_or_404(Article.objects.filter(pk=id)