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

How to convert class based detail view in function based view?

我是一名学习者,我正在通过使用 django 做一个会计应用程序来学习 django。

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

这是我要转换的代码:

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 中的日志模型中执行的一些功能...

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

谢谢

首先,您需要编写函数签名。由于它是一个函数而不是 class,建议的名称更改为 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 模式以使用新视图:

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