目录
8.1 商品详情
goods.views.py修改GoodsListView
class GoodsListViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin,viewsets.GenericViewSet):
goods.serializer.py
class GoodsImageSerializer(serializers.ModelSerializer):
class Meta:
model = GoodsImage
fields = ("image",)
class GoodsSerialize(serializers.ModelSerializer):#serializers.ModelSerializer不再继承serializers.Serializer了
category = GoodsCategorySerialize()#category 为goods的外键这里直接继承外键的内容,就可以将外键的内容全部显示,但是前端无影响!!!
images = GoodsImageSerializer(many=True)
class Meta:
model = Goods
fields = "__all__"
8.3商品收藏
user_operator.serializers.py
from rest_framework.validators import UniqueTogetherValidator
from rest_framework import serializers
from .models import UserFav,UserLeavingMessage,UserAddress
from goods.serializer import GoodsSerializer
class UserFavSerializer(serializers.ModelSerializer):
user = serializers.HiddenField(#收藏使用当前用户
default=serializers.CurrentUserDefault()
)
class Meta:
model = UserFav
# 使用validate方式实现唯一联合
validators = [
UniqueTogetherValidator(
queryset=UserFav.objects.all(),
fields=('user', 'goods'),
message="已经收藏"#消息会返回到前端
)
]
fields = ("user", "goods", "id")
user_operator.views.py
class UserFavViewset(viewsets.GenericViewSet, mixins.ListModelMixin, mixins.CreateModelMixin, mixins.RetrieveModelMixin,
mixins.DestroyModelMixin):
"""
list:
获取用户收藏列表
retrieve:
判断某个商品是否已经收藏
create:
收藏商品
"""
queryset = UserFav.objects.all()
# permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
serializer_class = UserFavSerializer
8.4用户权限设置
1、在utils中新建premissions.py 文件
from rest_framework import permissions
#验证是否为当前用户
class IsOwnerOrReadOnly(permissions.BasePermission):
"""
Object-level permission to only allow owners of an object to edit it.
Assumes the model instance has an `owner` attribute.
"""
def has_object_permission(self, request, view, obj):
# Read permissions are allowed to any request,
# so we'll always allow GET, HEAD or OPTIONS requests.
if request.method in permissions.SAFE_METHODS:
return True
# Instance must have an attribute named `owner`.
return obj.user == request.user
修改user_operatior.views.py文件
from django.shortcuts import render
from rest_framework import viewsets
from rest_framework import mixins
# Create your views here.
from .models import UserFav, UserLeavingMessage, UserAddress
from .serializers import UserFavSerializer, UserFavDetailSerializer, LeavingMessageSerializer, AddressSerializer
from rest_framework.permissions import IsAuthenticated
from utils.permissions import IsOwnerOrReadOnly
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
from rest_framework.authentication import SessionAuthentication
class UserFavViewset(viewsets.GenericViewSet, mixins.ListModelMixin, mixins.CreateModelMixin, mixins.RetrieveModelMixin,
mixins.DestroyModelMixin):
"""
list:
获取用户收藏列表
retrieve:
判断某个商品是否已经收藏
create:
收藏商品
"""
# queryset = UserFav.objects.all()
#验证是否登陆
permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
serializer_class = UserFavSerializer
lookup_field = 'goods_id'
# lookup_field = 'goods'
#用户权限认证
authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
# 收藏数+1
# def perform_create(self, serializer):
# instance = serializer.save()
# # 通过这个instance Userfav找到goods
# goods = instance.goods
# goods.fav_num +=1
# goods.save()
#值获取当前用户收藏
def get_queryset(self):
return UserFav.objects.filter(user=self.request.user)
8.5用户收藏功能和前端联调
前端代码有bug,需要修改cookie.setCkooie(),cookie.getCookie(),还有收藏的函数