如何在基于函数的视图中转换基于类的详细视图?

时间:2018-10-02 12:34:27

标签: python django django-views django-urls

我是一名学习者,正在通过使用django进行会计核算来学习django。

我想知道如何将基于关键类的详细视图转换为基于函数的视图

这是我要转换的代码:

class ledger1DetailView(LoginRequiredMixin,DetailView):
    context_object_name = 'ledger1_details'
    model = ledger1
    template_name = 'accounting_double_entry/ledger1_details.html'

    def get_object(self):
        pk1 = self.kwargs['pk1']
        pk2 = self.kwargs['pk2']
        get_object_or_404(company, pk=pk1)
        ledger = get_object_or_404(ledger1, pk=pk2)
        return ledger

    def get_context_data(self, **kwargs):
        context = super(ledger1DetailView, self).get_context_data(**kwargs) 
        context['journal_list']    = journal.objects.all()
        context['company_list']    = company.objects.all()
        journal_details            = get_object_or_404(journal, pk=self.kwargs['pk'])
        context['Debitcount']      = journal_details.debitsum()
        context['company_list']    = journal_details.creditsum()
        company_details            = get_object_or_404(company, pk=self.kwargs['pk1'])
        context['company_details'] = company_details
    return context

这是我的urls.py:

url(r'^company/(?P<pk1>\d+)/ledgerdetail/(?P<pk2>\d+)/$',views.ledger1DetailView.as_view(),name='ledgerdetail'),

所以您可以了解pk1和pk2是什么...而pk是日记帐对象的ID ...我想传递我在ledger1detailview的日记帐模型中执行的某些功能...

如果有人知道该怎么做...请帮助

谢谢

1 个答案:

答案 0 :(得分:2)

首先,您需要编写函数签名。由于它是一个函数,而不是一个类,因此建议的名称更改为ledger1_detail_viewlogin_required装饰器与LoginRequiredMixin做相同的工作。

然后,您需要获取对象。这类似于get_object中的代码。请注意,您不再有self.kwargs,而函数签名中有pk1pk2

然后,您需要构建上下文字典。这将类似于您的get_context_data方法。

最后,您可以使用render快捷方式来呈现模板。

将其放在一起,视图的结构将为:

from django.contrib.auth.decorators import login_required

@login_required
def ledger1_detail_view(request, pk1, pk2):

    get_object_or_404(company, pk=pk1)
    ledger = get_object_or_404(ledger1, pk=pk2)

    context = {}
    context['ledger1_details'] = ledger
    # Add other items to the context
    ...

    return render(request, 'accounting_double_entry/ledger1_details.html', context)

记住要更改您的网址格式以使用新视图:

url(r'^company/(?P<pk1>\d+)/ledgerdetail/(?P<pk2>\d+)/$', views. ledger1_detail_view, name='ledgerdetail'),