首页 > 解决方案 > Django 2.0:必须使用对象 pk 或 slug 调用通用详细视图

问题描述

所以我只是在我的详细视图中添加了一个更新视图。但是,当我在下面添加“编辑”按钮后尝试加载页面时,我收到了通用详细信息视图错误。到底是怎么回事?

模板页面:

<td><a href="{% url 'thing:update' thing_id=thing_id%}" class="btn btn-primary" class>Edit</a></td>

网址.py

        path('update/<slug:thing_id>/', ThingUpdateView.as_view(), name='update'),

视图.py

    class ThingUpdateView(LoginRequiredMixin, UpdateView):
    model      = ThingUser
    form_class = ThingUserFormSet
    template_name = "thing/update.html"

追溯

File "C:\myapp\lib\site-packages\django\core\handlers\exception.py" in inner
  35.             response = get_response(request)

File "C:\myapp\lib\site-packages\django\core\handlers\base.py" in _get_response
  128.                 response = self.process_exception_by_middleware(e, request)

File "C:\myapp\lib\site-packages\django\core\handlers\base.py" in _get_response
  126.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\myapp\lib\site-packages\django\views\generic\base.py" in view
  69.             return self.dispatch(request, *args, **kwargs)

File "C:\myapp\lib\site-packages\django\contrib\auth\mixins.py" in dispatch
  52.         return super().dispatch(request, *args, **kwargs)

File "C:\myapp\lib\site-packages\django\views\generic\base.py" in dispatch
  89.         return handler(request, *args, **kwargs)

File "C:\myapp\lib\site-packages\django\views\generic\edit.py" in get
  189.         self.object = self.get_object()

File "C:\myapp\lib\site-packages\django\views\generic\detail.py" in get_object
  47.                                  % self.__class__.__name__)

Exception Type: AttributeError at /thing/update/8bv4tyrkyy/
Exception Value: Generic detail view ThingUpdateView must be called with either an object pk or a slug.

标签: djangodjango-views

解决方案


默认情况下,Django 使用slugslug url 关键字参数。由于您正在使用thing_id,您需要使用slug_url_kwarg属性在视图中设置它:

class ThingUpdateView(LoginRequiredMixin, UpdateView):
    model      = ThingUser
    form_class = ThingUserFormSet
    template_name = "thing/update.html"
    slug_url_kwarg = 'thing_id'

推荐阅读