I am making a ecommerce website and want to display my products by category. Whereby products of the same category are displayed in one card. I am developing it in django but want to inquire if there is a way i could do this in class based views. since in my home page i used ListView. This is how my views.py looks like:
from urllib import request
from django.shortcuts import redirect, render, get_object_or_404
from account.models import Account
from django.views.generic import ListView, DetailView, View
from django.utils import timezone
from homeapp.forms import SearchForm
from homeapp.models import *
from django.contrib import messages
from django.contrib.auth.mixins import LoginRequiredMixin
from django.core.exceptions import ObjectDoesNotExist
from django.contrib.auth.decorators import login_required
class HomeView(ListView):
paginate_by = 5
model = Product
template_name = 'homeapp/home.html'
class CartView(DetailView):
model = Product
template_name = 'homeapp/product.html'
class shopView(LoginRequiredMixin, View):
login_url='/account/login/'
def get(self, *args, **kwargs):
try:
order = Order.objects.get(user=self.request.user, ordered=False)
context = {
'object': order
}
return render(self.request, 'homeapp/cart.html', context)
except ObjectDoesNotExist:
return redirect("/")
@login_required(login_url='/account/login/')
def add_to_cart(request, slug):
product = get_object_or_404(Product, slug=slug)
order_product, created = OrderProduct.objects.get_or_create(product=product,
user=request.user,
ordered=False)
order_qs = Order.objects.filter(user=request.user, ordered=False)
if order_qs.exists():
order = order_qs[0]
if order.products.filter(product__slug=product.slug).exists():
order_product.quantity += 1
order_product.save()
messages.info(request, "This item quantity was updated.")
return redirect("homeapp:cart")
else:
order.products.add(order_product)
messages.info(request, "This item was added to your cart.")
return redirect("homeapp:product", slug=slug)
else:
ordered_date = timezone.now()
order = Order.objects.create(user=request.user, ordered_date=ordered_date)
order.products.add(order_product)
return redirect("homeapp:product",slug=slug)
def remove_from_cart(request, slug):
product = get_object_or_404(Product, slug=slug)
order_qs = Order.objects.filter(user=request.user, ordered=False)
if order_qs.exists():
order = order_qs[0]
if order.products.filter(product__slug=product.slug).exists():
order_product = OrderProduct.objects.filter(product=product,
user=request.user,
ordered=False)[0]
order.products.remove(order_product)
else:
return redirect("homeapp:product",slug=slug)
else:
return redirect("homeapp:cart",slug=slug)
return redirect("homeapp:product",slug=slug)
@login_required
def remove_single_product_from_cart(request, slug):
product = get_object_or_404(Product, slug=slug)
order_qs = Order.objects.filter(
user=request.user,
ordered=False
)
if order_qs.exists():
order = order_qs[0]
# check if the order item is in the order
if order.products.filter(product__slug=product.slug).exists():
order_product = OrderProduct.objects.filter(
product=product,
user=request.user,
ordered=False
)[0]
if order_product.quantity > 1:
order_product.quantity -= 1
order_product.save()
else:
order.products.remove(order_product)
messages.info(request, "This item quantity was updated.")
return redirect("homeapp:cart")
else:
messages.info(request, "This item was not in your cart")
return redirect("homeapp:product", slug=slug)
else:
messages.info(request, "You do not have an active order")
return redirect("homeapp:product", slug=slug)
I would love to continue using the class based view. How can i do that?
You can limit ListView results to a single category by overriding get_queryset
method.
See here: Django ListView customising queryset
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.