like save correctly in to the database,but I don’t know how to get and show user favorite count.
my error now: AttributeError: 'list' object has no attribute 'objects'
.
I think the problem with my code is mostly in this parts:models.py count_favorites_by_session()
and views.py statuse_of_favorite_list()
favorite.py
class favoriteProduct:
def __init__(self,request) -> None:
self.session=request.session
favorite_product=self.session.get('favorite_product')
if not favorite_product:
favorite_product=self.session['favorite_product']=[]
self.favorite_product=favorite_product
self.count=Favorite.count_favorites_by_session()
def __iter__(self):
favorite_product=self.favorite_product.copy()
for item in favorite_product:
yield item
def add_to_favorite_product(self,productId):
productId=int(productId)
if productId not in self.favorite_product:
self.favorite_product.append(productId)
self.count=Favorite.count_favorites_by_session()
self.session.modified=True
models.py
class Favorite(models.Model): product=models.ForeignKey(Product,on_delete=models.CASCADE,related_name='favorite_product',verbose_name='product')
favorite_user=models.ForeignKey(CustomUser, on_delete=models.CASCADE,related_name='favorite_user1',verbose_name='user favorite')
register_date=models.DateTimeField(auto_now_add=True,verbose_name='register date')
def __str__(self) -> str:
return f"{self.product} - {self.favorite_user}"
class Meta:
verbose_name='favorite'
verbose_name_plural='favorites'
def count_favorites_by_session(self):
request=RequestMiddleware(get_response=None)
request=request.thread_local.current_reques
session=request.session
favorite_product_ids =session.get('favorite_product')
return self.objects.filter(product__id__in=favorite_product_ids).count()
views.py
class ShowFavoriteListView(View):
def get(self,request,*args,**kwargs):
favorite_list=favoriteProduct(request)
context={
'favorite_list':favorite_list,
}
return render(request,'csf_app/partials/create_favorites.html',context)
def statuse_of_favorite_list(request):
favoriteList=favoriteProduct(request)
return HttpResponse(favoriteList.count)
def add_to_favorite(request):
productId=request.GET.get('productId')
product=Product.objects.get(id=productId)
flag=Favorite.objects.filter(
Q(favorite_user_id=request.user.id) &
Q(product_id=productId)).exists()
if(not flag):
Favorite.objects.create(product=product,favorite_user=request.user,)
return HttpResponse('added to favorite lists')
return HttpResponse('it was in favorite')
class UserFavoriteView(View):
def get(self,request,*args,**kwargs): user_favorite_products=Favorite.objects.filter(Q(favorite_user_id=request.user.id))
return render(request,'csf_app/user_favorite.html',{'user_favorite_products':user_favorite_products})
urls.py
urlpatterns = [
path('add_to_favorite/',views.add_to_favorite,name='add_to_favorite'),
path('user_favorite_list/',views.UserFavoriteView.as_view(),name='user_favorite_list'),
path('statuse_of_favorite_list/',views.statuse_of_favorite_list,name='statuse_of_favorite_list'),
]
myscript.js
statuse_of_favorite_list();
function statuse_of_favorite_list(){
$.ajax({
type:"GET",
url:"/csf/statuse_of_favorite_list/",
success: function(res){
$('#favorite_count_icon').show();
$('#favorite_count').text(res);}
});
}
function addToFavorite(productId){
$.ajax({
type:"GET",
url:"/csf/add_to_favorite/",
data:{
productId: productId,},
success: function(res){
alert(res)
statuse_of_favorite_list();}
});
}
createfavorites.html
...{% block content %}
<div id="favorite_list">
{% render_partial 'csf:user_favorite_list' %}
</div>...
**produc_box.html**
....<button type="button" onclick="addToFavorite({{product.id}})">
<i class="fa fa-heart-broken"></i>
<span class="fake-svg-icon fake-svg-icon--wishlist-16"></span>
</button>....
5