Django:1.5:覆盖generic.DetailView返回404

时间:2013-11-18 01:49:35

标签: django django-views

我有一个generic.DetailView,我试图覆盖函数get_queryset(self)我正在执行以下操作:

class MyView(generic.DetailView):
    model = MyModel
    slug_field='guid'
    template_name = 'myhtml.html'

    def get_queryset(self):
        guid = uuid.UUID(self.kwargs.get('slug'))
        x = MyModel.objects.all().filter(guid=guid)
        pprint(x)
        return MyModel.objects.all().filter(guid=guid)

这是urls.py:

urlpatterns = patterns('',
url (r'^(?P<slug>[A-Fa-f0-9]{30,32})$', view.MyView.as_view(), name='myview'),

当我运行该页面时,我一直收到404错误。但是,我知道MyModel会返回一些内容,因为pprint返回:

[<MyModel: mydata>] 

PS如果我用PK做同样的修改:我仍然得到404:

    def get_queryset(self):
        return MyModel.objects.all().filter(id=pk)

...and I know MyModel.objects.all().filter(id=pk) returns data

我错过了什么?

由于

1 个答案:

答案 0 :(得分:0)

您收到404因为get_object()get_queryset()之后运行,它再次过滤了查询集(使用slug url kwarg),没有给您任何结果。

您应该覆盖get_object()方法并返回单个对象。

这样的事情应该有效:

def get_object(self, queryset=None):
    slug = self.kwargs.get(self.slug_url_kwarg, None)
    guid = uuid.UUID(slug)
    return queryset.get(guid=guid)

注意: 这只是一个简单的示例,您应该查看原始get_object()方法,并了解如何处理所有边缘情况和异常。