Как отфильтровать товар по категории в Django, используя общий класс представления

Я делаю POS-систему, в которой будут клиенты, и у каждого клиента будут свои транзакции. Я могу показать все транзакции, но мне трудно понять, как отфильтровать транзакции только по клиенту. В models.py

class Customer(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()
    address = models.CharField(max_length=200)
    number = models.IntegerField(null=True, blank=True)

class AccountHolder(models.Model):
    customer = models.ForeignKey(Customer, on_delete=CASCADE)
    date = models.DateTimeField(default=timezone.now, auto_created=True)
    share_deposit = models.IntegerField(blank=True, null=True)
    share_return = models.IntegerField(blank=True, null=True)
    share_total = models.IntegerField(blank=True, null=True)

Я хочу использовать общие классы для выполнения фильтрации. Внутри views.py

class CustomerDetail(ListView):
    model = AccountHolder
    context_object_name = 'customers'
    template_name = 'customertransaction.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['customers'] = context['customers'].filter(customer=self.request.customer)

Если вы хотите фильтровать результат представления, основанного на общем классе, переопределите метод get_queryset() вместо манипулирования context_data переменной.

def get_queryset(self):
    customer_id = self.kwargs['id']  # Assume that the url is like /account_holder/5 where 5 is the id of the customer
    customer = Customer.objects.get(id=customer_id)
    return AccountHolder.objects.filter(customer=customer)

Но если по какой-то причине вы вынуждены использовать context_data, то исправьте свой фильтр следующим образом :

# You wrote customer=self.request.customer
# If you have not wrote any middleware, request have not attribut customer
# You must retrieve the customer and filter AccountHolder by it.
customer = Customer.objects.get(id=self.kwargs['id'])
context['customers'] = context['customers'].filter(customer=cutomer)
Вернуться на верх