基于类的视图中的Django动态筛选

2024-09-25 10:19:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从一个已经过滤过的视图中编写一个基于类的视图。然而,我无法找到如何将参数传递给CBV

我将django 3.0.4与pipenv python 3.8一起使用

例如,假设我有两个模型:

class Customer(models.Model):
    first_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=20)
    email = models.EmailField()

class WorkOrder(models.Model):
    date_created = models.DateField('Date', default=datetime.now)
    due_date = models.DateField('Due Date')
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE, verbose_name='Customer')
    STATUS_CHOICES = [
        ('pending', 'Pending'),
        ('approved', 'Approved'),
        ('completed', 'Completed'),
        ('cancelled', 'Cancelled'),
    ]
    status = models.CharField('Status of the work order', max_length=10, choices=STATUS_CHOICES, default='pending')
    description = models.TextField('Description of the work')

我写了一个FBV,用于列出按状态筛选的客户的工作订单。诸如此类:

def customer_workorders(request, pk):

    customer = CustomUser.objects.get(pk=pk)
    pending_workorders = WorkOrder.objects.filter(customer=pk).filter(status='pending')
    approved_workorders = WorkOrder.objects.filter(customer=pk).filter(status='approved')
    completed_workorders = WorkOrder.objects.filter(customer=pk).filter(status='completed')
    cancelled_workorders = WorkOrder.objects.filter(customer=pk).filter(status='cancelled')

    context = {
        'customer': customer,
        'pending': pending_workorders,
        'approved': approved_workorders,
        'completed': completed_workorders,
        'cancelled': cancelled_workorders
    }

    return render(request, 'reports/cusomer_workorders.html', context)

我正试图根据每个工单的状态创建一个CBV列表视图

我知道我基于类的观点应该是这样的

class CustomerWorkOrderPendingView(LoginRequiredMixin, ListView):

    template_name = 'reports/customer_workorders_list.html'

    def get_queryset(self):

        return WorkOrder.objects.filter(customer=customer).filter(status='pending')

我的问题是如何根据CBV获取客户对象?更一般地说,如何传递参数以便在CBV中使用它进行查询

我知道我可以传递一个变量,比如

{% url 'to_some_view' variable %}

在FBV中,我可以得到变量

def a_view(request, variable):
   some logic with variable

我在CBV里怎么做

谢谢你抽出时间


Tags: name视图objectsmodelsstatuscustomerfiltercbv
1条回答
网友
1楼 · 发布于 2024-09-25 10:19:32

对于那些感兴趣的人,我想出了一个解决办法

就我而言,你似乎什么都不用做

用户id已在url中传递,而不是

return WorkOrder.objects.filter(customer=customer).filter(status='pending')

只查询状态就足够了

return WorkOrder.objects.filter(status='pending')

这将返回上一个视图中列出的“用户”的工单,并添加第二个筛选器(status='pending')

相关问题 更多 >