Как отфильтровать товар по категории в 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)