Django+Vue打造購(gòu)物網(wǎng)站(七)

個(gè)人中心功能開(kāi)發(fā)

drf文檔注釋
http://www.django-rest-framework.org/topics/documenting-your-api/

動(dòng)態(tài)設(shè)置serializer和permission獲取用戶信息

獲取詳情只需要添加一個(gè)mixins.RetrieveModelMixin,就行了

用戶詳情的序列化
users/serializers.py

class UserDetailSerializer(serializers.ModelSerializer):
    """
    用戶詳情
    """
    class Meta:
        model = User
        fields = ("name", "gender", "birthday", "email","mobile")

views.py

class UserViewset(mixins.CreateModelMixin, mixins.RetrieveModelMixin, mixins.UpdateModelMixin, viewsets.GenericViewSet):
    '''
    用戶信息管理
    create:
        用戶注冊(cè)
    retrieve:
        個(gè)人信息
    update:
        修改個(gè)人信息
    '''
    queryset = User.objects.all()
    authentication_classes = (JSONWebTokenAuthentication, authentication.SessionAuthentication)

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = self.perform_create(serializer)

        # 注冊(cè)成功直接生成token,自動(dòng)登陸
        re_dict = serializer.data
        payload = jwt_payload_handler(user)
        re_dict["token"] = jwt_encode_handler(payload)
        re_dict["name"] = user.name if user.name else user.username

        headers = self.get_success_headers(serializer.data)

        # 返回的不是serializer.data,而是我們自己寫的re_dict
        return Response(re_dict, status=status.HTTP_201_CREATED, headers=headers)

    # 這里需要?jiǎng)討B(tài)權(quán)限配置
    # 1.用戶注冊(cè)的時(shí)候不應(yīng)該有權(quán)限限制
    # 2.當(dāng)想獲取用戶詳情信息的時(shí)候,必須登錄才行
    def get_permissions(self):
        if self.action == "retrieve":
            return [permissions.IsAuthenticated(), ]
        elif self.action == "create":
            return []

        return []

    # 這里需要?jiǎng)討B(tài)選擇用哪個(gè)序列化方式
    # 1.UserRegSerializer(用戶注冊(cè)),只返回username和mobile,會(huì)員中心頁(yè)面需要顯示更多字段,所以要?jiǎng)?chuàng)建一個(gè)UserDetailSerializer
    # 2.問(wèn)題又來(lái)了,如果注冊(cè)的使用userdetailSerializer,又會(huì)導(dǎo)致驗(yàn)證失敗,所以需要?jiǎng)討B(tài)的使用serializer
    def get_serializer_class(self):
        if self.action == "retrieve":
            return UserDetailSerializer
        elif self.action == "create":
            return UserRegSerializer

        return UserDetailSerializer

    # 雖然繼承了Retrieve可以獲取用戶詳情,但是并不知道用戶的id,所有要重寫get_object方法
    # 重寫get_object方法,就知道是哪個(gè)用戶了
    def get_object(self):
        return self.request.user

    def perform_create(self, serializer):
        return serializer.save()

用戶個(gè)人信息修改,只需要繼承mixins.UpdateModelMixin就可以了

用戶收藏

user_operation/serializer.py

class UserFavDetailSerializer(serializers.ModelSerializer):
    '''
    用戶收藏詳情
    '''

    # 通過(guò)商品id獲取收藏的商品,需要嵌套商品的序列化
    goods = GoodsSerializer()

    class Meta:
        model = UserFav
        fields = ("goods", "id")

views.py

class UserFavViewset(viewsets.GenericViewSet, mixins.ListModelMixin, mixins.CreateModelMixin, mixins.DestroyModelMixin):
    '''
    list:
        獲取用戶的所有收藏
    create:
        添加收藏
    destroy:
        取消收藏
    '''
    # permission是用來(lái)做權(quán)限判斷的
    # IsAuthenticated:必須登錄用戶;IsOwnerOrReadOnly:必須是當(dāng)前登錄的用戶
    permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
    # auth使用來(lái)做用戶認(rèn)證的
    authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
    # 搜索的字段
    lookup_field = 'goods_id'

    def get_queryset(self):
        # 只能查看當(dāng)前登錄用戶的收藏,不會(huì)獲取所有用戶的收藏
        return UserFav.objects.filter(user=self.request.user)

    # 動(dòng)態(tài)選擇serializer
    def get_serializer_class(self):
        if self.action == "list":
            return UserFavDetailSerializer
        elif self.action == "create":
            return UserFavSerializer
        return UserFavSerializer

用戶留言功能

user_operation/serializers.py

class LeavingMessageSerializer(serializers.ModelSerializer):
    '''
    用戶留言
    '''
    # 獲取當(dāng)前登錄的用戶
    user = serializers.HiddenField(
        default=serializers.CurrentUserDefault()
    )
    # read_only:只返回,post時(shí)候可以不用提交,format:格式化輸出
    add_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M')

    class Meta:
        model = UserLeavingMessage
        fields = ("user", "message_type", "subject", "message", "file", "id", "add_time")

views.py

class LeavingMessageViewset(mixins.ListModelMixin, mixins.DestroyModelMixin, mixins.CreateModelMixin,
                            viewsets.GenericViewSet):
    """
    list:
        獲取用戶留言
    create:
        添加留言
    delete:
        刪除留言功能
    """

    permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
    authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
    serializer_class = LeavingMessageSerializer

    # 只能看到自己的留言
    def get_queryset(self):
        return UserLeavingMessage.objects.filter(user=self.request.user)

urls.py

# 配置用戶留言的url
router.register(r'messages', LeavingMessageViewset, base_name="messages")

用戶收獲地址

user_operation/serializers.py

class AddressSerializer(serializers.ModelSerializer):
    user = serializers.HiddenField(
        default=serializers.CurrentUserDefault()
    )
    add_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M')

    class Meta:
        model = UserAddress
        fields = ("id", "user", "province", "city", "district", "address", "signer_name", "add_time", "signer_mobile")

views.py

class AddressViewset(viewsets.ModelViewSet):
    """
    收貨地址管理
    list:
        獲取收貨地址
    create:
        添加收貨地址
    update:
        更新收貨地址
    delete:
        刪除收貨地址
    """
    permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
    authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
    serializer_class = AddressSerializer

    def get_queryset(self):
        return UserAddress.objects.filter(user=self.request.user)

urls.py

# 配置收貨地址
router.register(r'address',AddressViewset , base_name="address")
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容