我有一个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
我错过了什么?
由于
答案 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()
方法,并了解如何处理所有边缘情况和异常。