2017-07-25 123 views
1

我得到這個以下錯誤:的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' ..你可以發佈答案 –

回答

1

你的觀點被命名爲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'), 
1

這可能是值得加入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', 
    ), 
]