簡體   English   中英

Django - 基於類的視圖中的動態過濾

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM