[英]Django - Dynamic filtering in class based views
我正在嘗試從已經過濾的視圖中編寫基於類的視圖。 但是我不知道如何將參數傳遞給 CBV。
我正在使用帶有 pipenv python 3.8 的 django 3.0.4
例如,假設我有 2 個模型:
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 中做到這一點?
感謝您的時間。
對於那些感興趣的人,我想出了一個解決方案......
就我而言,您似乎什么都不用做!
用戶 id 已經在 url 中傳遞,而不是
return WorkOrder.objects.filter(customer=customer).filter(status='pending')
僅查詢狀態就足夠了。
return WorkOrder.objects.filter(status='pending')
這將返回上一個視圖中列出的“用戶”的工作訂單,並添加第二個過濾器 (status='pending')。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.