【问题标题】:Django Generic View - ListView from an instance of DetailViewDjango Generic View - 来自 DetailView 实例的 ListView
【发布时间】:2019-02-12 19:05:57
【问题描述】:

我正在使用通用视图 DetailViewListView

我有三个模型,例如 UserBusinessInvoice。一个用户可以有多个企业可以有多个发票。

#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"

但这不起作用,因为我要覆盖每个班级的model...

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

【问题讨论】:

    标签: django django-models django-templates django-views django-generic-views


    【解决方案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'])
    

    【讨论】:

    • 但是,我还想在InvoiceListView 上使用BusinessOwnerRequiredMixin 。只有所有者可以查看该特定业务的InvoiceListView 。如何实现?
    • 您可以在这个视图中实现一个简单的get_object 方法,从kwargs 中获取业务,然后mixin 就可以工作了。
    • 是的。没有考虑。谢谢。
    • 嘿,我还有一个http://example.com/business/1/invoices/1/=> InvoiceDetailView。如果我在这里实现get_object 并使用BusinessOwnerRequiredMixin,这将覆盖Invoice 对象。有什么帮助吗?
    猜你喜欢
    • 2014-10-23
    • 2015-04-29
    • 1970-01-01
    • 2017-05-08
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 2011-07-01
    相关资源
    最近更新 更多