代码之家  ›  专栏  ›  技术社区  ›  Sreekanth Reddy Balne

Django Generic View-来自DetailView实例的ListView

  •  0
  • Sreekanth Reddy Balne  · 技术社区  · 6 年前

    我使用的是通用视图 DetailView ListView

    我有三个这样的模型 User , Business Invoice

    #mixins.py
    class BusinessOwnerRequiredMixin(object):
    
        def has_permissions(self):
            obj = self.get_object()
            if isinstance(obj, Business):
            # Assumes that your Article model has a foreign key called `auteur`.
                return obj.owner == self.request.user
    
        def dispatch(self, request, *args, **kwargs):
            if not self.has_permissions():
                raise PermissionDenied
            return super(BusinessOwnerRequiredMixin, self).dispatch(request, *args, **kwargs)
    

    #views.py
    class BusinessDashboard(BusinessOwnerRequiredMixin, DetailView):
        model = Business
        template_name = "business/business-main.html"
    
    class InvoiceListView(BusinessDashboard):
        template_name = "business/purchase/purchase_invoice-main.html"
    
    class InvoiceDetailView(InvoiceListView):
        template_name = "business/purchase/purchase_invoice.html"
    

    #urls.py
    path(r'business/<pk>/purchase_invoices/<pid>/',vw.PurchaseInvoiceDetailView.as_view(), name='purchase_invoice'),
    path(r'business/<pk>/purchase_invoices/',vw.PurchaseInvoiceListView.as_view(), name='purchase_invoices')
    

    如何实现这一点,如:

     #views.py
        #views.py
    class BusinessDashboard(BusinessOwnerRequiredMixin, DetailView):
        model = Business
        template_name = "business/business-main.html"
    
    class InvoiceListView(BusinessDashboard, ListView):
        model = Invoice
        template_name = "business/purchase/purchase_invoice-main.html"
    
    class InvoiceDetailView(InvoiceListView, DetailView):
        model = Invoice
        template_name = "business/purchase/purchase_invoice.html"
    

    但那不管用,因为我要推翻 model 在每节课上。。。

    对于url http://example.com/business/1/invoices/1/ ,在模板中,我必须有一个带有invoice实例的变量。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Daniel Roseman    6 年前

    不需要继承,只需要定义 get_queryset

    class InvoiceListView(ListView):
        template_name = "business/purchase/purchase_invoice-main.html"
    
        def get_queryset(self):
            return Invoice.objects.filter(business_id=self.kwargs['pk'])