Django 通用视图 - 来自 DetailView 实例的 ListView
Django Generic View - ListView from an instance of DetailView
我正在使用通用视图 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')
我正在寻找的是从业务的 DetailView 继承发票的 ListView,即从业务的实例继承,即必须列出特定业务的所有发票。
如何实现:
#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"
但这行不通,因为我在每个 class...
上覆盖了 model
对于 url http://example.com/business/1/invoices/1/
,在模板中我必须有一个带有发票实例的变量。
不需要继承;您只需要定义 get_queryset
以按业务 pk 过滤发票。
class InvoiceListView(ListView):
template_name = "business/purchase/purchase_invoice-main.html"
def get_queryset(self):
return Invoice.objects.filter(business_id=self.kwargs['pk'])
我正在使用通用视图 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')
我正在寻找的是从业务的 DetailView 继承发票的 ListView,即从业务的实例继承,即必须列出特定业务的所有发票。
如何实现:
#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"
但这行不通,因为我在每个 class...
上覆盖了model
对于 url http://example.com/business/1/invoices/1/
,在模板中我必须有一个带有发票实例的变量。
不需要继承;您只需要定义 get_queryset
以按业务 pk 过滤发票。
class InvoiceListView(ListView):
template_name = "business/purchase/purchase_invoice-main.html"
def get_queryset(self):
return Invoice.objects.filter(business_id=self.kwargs['pk'])