的Django:的DetailView实现get_queryset()

问题描述:

我得到这个以下错误:的Django:的DetailView实现get_queryset()

ImproperlyConfigured at /elearning/7447932a-6044-498a-b902-97cbdd0a4001/ 
DetailView is missing a QuerySet. Define DetailView.model, DetailView.queryset, or override DetailView.get_queryset(). 

DetailView Django文档,除非我要重写它的get_query不是强制性的。

view.py

class CourseDetailView(DetailView): 

    model = Course 
    template_name='elearning/detail.html' 

    def get_object(self): 
     course = get_object_or_404(Course, pk=self.kwargs['pk']) 
     return self.model.objects.filter(pk=pk) 

    def get_context_data(self, **kwargs): 
     context = super(CourseDetailView, self).get_context_data(**kwargs) 
     context['now'] = timezone.now() 
     return context 

urls.py

url(r'^(?P<pk>[0-9a-z-]+)/$', views.DetailView.as_view(), name='course-detail'), 

列表视图模板

<a href="{% url 'elearning:course-detail' article.course_id %}">{{ article.title }}</a> 

models.py

class Course(models.Model): 
    course_id = models.UUIDField(default=uuid.uuid4, editable=False) 
    ... 

我想知道为什么我应该实现一个get_queryset()?

我仍然得到同样的错误,当我添加get_queryset()

def get_queryset(self): 
    qs = super(CourseDetailView, self).get_queryset() 
    return qs.filter(pk=self.kwargs['pk']) 
+0

我们可以看到你的DetailView类吗? – shacker

+0

@shacker你正确'DetailView'应该在urls.py上被命名为'CourseDetailView' ..你可以发布答案 –

你的观点被命名为CourseDetailView但你在URL

url(r'^(?P<pk>[0-9a-z-]+)/$', views.DetailView.as_view(), name='course-detail'), 

使用DetailView所以将URL相关视图类

url(r'^(?P<pk>[0-9a-z-]+)/$', views.CourseDetailView.as_view(), name='course-detail'), 

这可能是值得加入queryset = Course.objects.all()到视图是有点冗长,解决错误。

至于def get_queryset(self),您可能想要使用它来对您的QuerySet执行一些自定义过滤。我将提供一个示例,说明如何使用def get_queryset(self)方法仅返回单个书中的页面。我已经完整包含多个URL模式,而只是实现get_queryset(self)

# models.py 
class Book(models.Model): 
    title = models.CharField(max_length=32) 

class Page(models.Model): 
    book = models.ForeignKey(Book) 
    page_num = models.IntegerField() 

# views.py 
class PageDetailView(DetailView): 
    queryset = Page.objects.all() 

    def get_queryset(self): 
     """Filter pages by a book""" 
     return self.queryset.filter(book_id=self.kwargs.get('book_id')) 

# urls.py 
urlpatterns = [ 
    url(
     r'^books/$', 
     views.BookListView.as_view(), 
     name='book-list', 
    ), 
    url(
     r'^books/(?P<pk>\d+)/$', 
     views.BookDetailView.as_view(), 
     name='book-detail', 
    ), 
    url(
     r'^books/(?P<book_id>\d+)/pages/$', 
     views.PageListView.as_view(), 
     name='page-list', 
    ), 
    url(
     r'^books/(?P<book_id>\d+)/pages/(?P<pk>\d+)/$', 
     views.PageDetailView.as_view(), 
     name='page-detail', 
    ), 
]