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().

Следуя документации Django в DetailView 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>

модели.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'])

person Papouche Guinslyzinho    schedule 25.07.2017    source источник
comment
Можем ли мы увидеть ваш класс DetailView?   -  person shacker    schedule 25.07.2017
comment
@shacker вы правы DetailView должно называться `CourseDetailView` на urls.py .. вы можете опубликовать ответ   -  person Papouche Guinslyzinho    schedule 25.07.2017


Ответы (2)


ваше представление называется CourseDetailView, но вы используете DetailView в URL

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

поэтому URL-адрес будет

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

Возможно, стоит добавить 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',
    ),
]
person A. J. Parr    schedule 25.07.2017