必须使用对象 pk 或 slug 调用通用详细视图结果

Posted

技术标签:

【中文标题】必须使用对象 pk 或 slug 调用通用详细视图结果【英文标题】:Generic detail viewResult must be called with either an object pk or a slug 【发布时间】:2015-10-22 12:26:18 【问题描述】:

我得到这个错误显示为标题。根据文件,我添加了“slug_url_kwarg = 'result'”,(结果是应用程序名称)。它不起作用,然后我添加了“def get_object(self):”,它返回错误为“id is a KeyError”

    它自己创建的数据库是一个primary ket:"id",所以我用这个"id"作为slug_field。这是正确的吗?

    您认为我是否有必要使用 UpdateView?我希望 html 在提交表单后显示结果(使用 ajax)?

感谢您的回复。

网址

url(r'^result_list/$',ResultView.as_view(),name='result'),

views.py

class ResultView(UpdateView):
    context_object_name = 'result_list'
    template_name = 'result_list.html'
    form_class = InputForm
    slug_field = 'result.id' ---here means the pk,right?
    slug_url_kwarg = 'result'



    def get_queryset(self):
        return Result.objects.all()

    def post(self, request, *args, **kwargs):
        form = InputForm(request.POST)
        if form.is_valid():
            if self.request.is_ajax():
                company = form.cleaned_data['company']
                region = form.cleaned_data['region']

                queryset=Result.objects.filter(region=region)
                return HttpResponse(simplejson.dumps(to_json),mimetype='application/json')
        else:
             return HttpResponse(form.errors)

    def get_context_data(self, **kwargs):
        context = super(ResultView, self).get_context_data(**kwargs)
        context["sales"] = self.get_queryset().aggregate(Sum('sales'))

    def get_object(self):
        object = get_object_or_404(Result,id=self.kwargs['id'])  <!here is not correct--->
        return object

追溯

File "C:\Python27\lib\site-packages\django-1.8.3-py2.7.egg\django\core\handlers\base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Python27\lib\site-packages\django-1.8.3-py2.7.egg\django\views\generic\base.py" in view
  71.             return self.dispatch(request, *args, **kwargs)
File "C:\Python27\lib\site-packages\django-1.8.3-py2.7.egg\django\views\generic\base.py" in dispatch
  89.         return handler(request, *args, **kwargs)
File "C:\Python27\lib\site-packages\django-1.8.3-py2.7.egg\django\views\generic\edit.py" in get
  267.         self.object = self.get_object()
File "C:\Users\user\Desktop\project\result\views.py" in get_object
  54.         object = get_object_or_404(Result,id=self.kwargs['id'])

Exception Type: KeyError at /result_list/
Exception Value: 'id'

【问题讨论】:

您没有在 URL 中传递任何 id。您希望此视图如何确定您的意思是哪个对象? 【参考方案1】:

您忘记映射 url 模式,您不需要在您的情况下指定 slug_field 和 slug_url_kwarg:

url(r'^dupont_list/(?P<pk>[0-9]+)/$', DupontView.as_view(), name='dupont'),

【讨论】:

嗨@iago1460,有一件事我不明白:我要显示的最终结果是一个“聚合”计算结果,它不是某个“id”行的值。但是去掉get_object(self)后,会显示错误为标题,那我能实现想要的功能吗? Aggregate 生成一个字典 "'sales_sum': 99.99 ",所以像这样访问那个值: context["sales"] = self.get_queryset().aggregate(Sum('sales' ))['sales_sum']

以上是关于必须使用对象 pk 或 slug 调用通用详细视图结果的主要内容,如果未能解决你的问题,请参考以下文章

通用详细视图 UserProfileDetailView 必须在 URLconf 中使用对象 pk 或 slug 调用

在 django 中使用 slugify 后的详细页面错误

将 Pk 或 Slug 传递给 Django 中的通用 DetailView?

难以将 slug 添加到 Django 中的通用详细信息视图

Django:两个模型中的一个 url 搜索(cbv)

更新和删除时如何在一个url链接中发送两个pk