AttributeError at /circular/1/detail/ 'CircularDetail' 对象在 Django 中没有属性'pk'


class CircularDetail(DeleteView):
    model = Circular
    template_name = 'genre/circular_detail.html'
    def get_context_data(self, **kwargs):
        ctx = super(CircularDetail, self).get_context_data(**kwargs)
        ctx['c'] = Circular.objects.get(pk=self.pk)
        ctx['sittings'] = Sitting.objects.all()
        ctx['ballot'] = Sitting.objects.all()
        return ctx

上面的视图给我以下错误:

回溯:

File "/home/ohid/test_venv/lib/python3.5/site-packages/django/core/handlers/base.py" in get_response
  149.                     response = self.process_exception_by_middleware(e, request)
File "/home/ohid/test_venv/lib/python3.5/site-packages/django/core/handlers/base.py" in get_response
  147.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/ohid/test_venv/lib/python3.5/site-packages/django/views/generic/base.py" in view
  68.             return self.dispatch(request, *args, **kwargs)
File "/home/ohid/test_venv/lib/python3.5/site-packages/django/views/generic/base.py" in dispatch
  88.         return handler(request, *args, **kwargs)
File "/home/ohid/test_venv/lib/python3.5/site-packages/django/views/generic/detail.py" in get
  118.         context = self.get_context_data(object=self.object)
File "/home/ohid/test_venv/myapp/genre/views.py" in get_context_data
  126.         ctx['c'] = Circular.objects.get(pk=self.pk)
Exception Type: AttributeError at /circular/1/detail/
Exception Value: 'CircularDetail' object has no attribute 'pk'

我需要你的帮助来解决这个问题。

URL参数是通过kwargs传递的,所以你可以通过这种方式访问它

self.kwargs.get("pk")

所以改变

ctx['c'] = Circular.objects.get(pk=self.pk)

ctx['c'] = Circular.objects.get(pk=self.kwargs.get("pk"))

首先,将您的基类固定为DetailView(而不是DeleteView)

DetailView继承自django.views.generic.detail.SingleObjectMixin (https://docs.djangoproject.com/en/1.10/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin),期望主键是在slug参数,所以修复你的URL regexp

r'^circular/(?P<slug>[-w]+)/detail$'

和访问您的对象使用self.object在视图或仅{{ object }}在模板

最新更新