Django - Dynami c фильтрация в представлениях на основе классов - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь написать представление на основе классов из уже отфильтрованного представления. Однако я не смог выяснить, как передать аргументы в CBV.

Я использую django 3.0.4 с pipenv python 3.8

в качестве примера, предположим, у меня есть 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?

Спасибо за ваше время.

1 Ответ

0 голосов
/ 02 апреля 2020

Для тех, кто был бы заинтересован, я нашел решение ...

В моем случае кажется, что вам НИЧЕГО не нужно делать!

Идентификатор пользователя уже передан в URL и вместо

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

достаточно сделать запрос только для статуса.

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

Возвращает рабочие задания пользователя, перечисленные в предыдущем представлении, и добавляет второй фильтр ( статус = 'в ожидании').

...