首页 > 解决方案 > Django:在 init() 中获取 DetailView 的模型

问题描述

您好,我正在尝试在它自己的init () 方法中访问详细视图模型。到目前为止,我有以下代码:

视图.py

class AccountDetailView(DetailView):

    model = Account
    template_name = 'account_detail.html'

    def __init__(self, **kwargs):
        super(AccountDetailView, self).__init__(**kwargs)
        timeline = kwargs.get('timeline')
        history = History.objects.filter(timeline=timeline).first()
        payHistory = history.topay_set.filter(payed=True, internal_source=self.object).order_by('-payDate')
        paginator = Paginator(payHistory, 10)

问题是 payHistory 中的“self.object”。如何从 DetailView 访问帐户?

我收到以下错误:

Traceback (most recent call last):
  File "C:\Users\Janik\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\Janik\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\Janik\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\Janik\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\views\generic\base.py", line 62, in view
    self = cls(**initkwargs)
  File "C:\Users\Janik\Documents\GitHub\jConomy\jConomy\apps\Account\views.py", line 45, in __init__
    payHistory = history.topay_set.filter(payed=True, internal_source=self.object).order_by('-payDate')
AttributeError: 'AccountDetailView' object has no attribute 'object'

标签: djangopython-3.xdjango-views

解决方案


那是因为self.object设置在get方法上,而不是__init__方法上。

我想你可以self.get_object()改用。

编辑

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    timeline = kwargs.get('timeline')
    history = History.objects.filter(timeline=timeline).first()
    payHistory = history.topay_set.filter(payed=True, internal_source=self.object).order_by('-payDate')
    paginator = Paginator(payHistory, 10)
    context['paginator'] = paginator
    return context

推荐阅读