django第八天,个人中心功能开发

新人学习django 是按照这个大佬的教程学习的
链接: https://www.cnblogs.com/derek1184405959/p/8733194.html.

很多步骤都是按照上面的教程学习的,这里只是记录一下自己学习的过程和一些错误
如果有人想要系统的学习,建议去上面那位大佬处学习

九,个人中心功能的开发
1.drf的api文档自动生成,生成之后可交于前端进行查看
(1)

#drf文档,title自定义
    path('docs',include_docs_urls(title='alotria')),

通过该url可以访问api的详情
django第八天,个人中心功能开发_第1张图片
drf的优点

  1. 自动生成
  2. 文档里可以做交互的测试
  3. 可以生成js,shell和python的代码段

代码中注释的格式:

class GoodsListViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin,viewsets.GenericViewSet):
    '''
    list:
        商品列表,分页,搜索,过滤,排序
    retrieve:
        获取商品详情
    '''

添加字段描述的三种方式
1.model的字段中加
2.serializer中字段加
3.filter字段加

2.在会员中心的页面,获取个人信息,只需要在UserViewset中多继承
mixins.RetrieveModelMixin

用户详情的序列化
user/serializers.py

class UserDetailSerializer(serializers.ModelSerializer):
    """
    用户详情
    """

    class Meta:
        model=User
        fields=("name","gender","birthday","email","mobile")

users/views.py

class UserViewset(CreateModelMixin,viewsets.GenericViewSet,mixins.RetrieveModelMixin,mixins.UpdateModelMixin):
    """
    用户
    """
    serializer_class=UserDetailSerializer
    queryset = User.objects.all()
    authentication_classes = (JSONWebTokenAuthentication,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)
        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)

        return  Response(re_dict,status=status.HTTP_201_CREATED,headers=headers)
    #设置动态的权限配置
    #当用户注册的时候不应该有权限限制
    #当想要获取用户详情的时候,必须登录才行

    def get_permissions(self):
        if self.action=="retrieve":
            return [IsAuthenticated()]
        elif self.action=="create":
            return []
        return []

    #动态配置序列化的方式
    #注册的时候使用UserRegSerializer,只返回username和mobile
    #会员中心要获取更多的用户信息,所以创建使用UserDetailSerializer
    def get_serializer_class(self):
        if self.action=="retrieve":
            return UserDetailSerializer
        elif self.action=="create":
            return UserRegSerializers
        return UserDetailSerializer

    #继承了RetrieveModelMixin可以知道用户的详情,但是不知道用户的id,
    #重写get_object方法获取用户id
    def get_object(self):
        return self.request.user

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

添加获取用户信息继承的方法:mixins.RetrieveModelMixin
获取登录的用户,重写get_object
动态权限分配 get_permissions(self):
动态序列化 get_serializer_class(self):
django第八天,个人中心功能开发_第2张图片
用户个人信息的修改,多继承mixins.UpdateModelMixin就可以
需要修改的都是继承updata

3.用户收藏
(1)获取用户详情的,只需要获取商品,和用户id
先序列化
user_operation/serializers.py

class UserFavDetailSerializer(serializers.ModelSerializer):
    """
    用户收藏详情
    """
    #通过用户id获取收藏的商品,需要嵌套商品的序列化
    goods=GoodsSerializer()
    class Meta:
        model=UserFav
        fields=("goods","id")

(2)user_operation/views.py
动态设置序列化的方式

class UserFavViewSet(viewsets.GenericViewSet,mixins.ListModelMixin,mixins.CreateModelMixin,mixins.DestroyModelMixin):
    """
    用户收藏
    """
    serializer_class = UserFavSerializer
    #permission是用来做权限判断的
    ## IsAuthenticated:必须登录用户;IsOwnerOrReadOnly:必须是当前登录的用户
    permission_classes = (IsAuthenticated,IsOwnerOrReadOnly)
    #auth做用户认证
    authentication_classes = (JSONWebTokenAuthentication,SessionAuthentication)
    #搜索的字段
    lookup_field = "goods_id"


    #动态选择序列化方式
    def get_serializer_class(self):
        if self.action=="list":
            return UserFavDetailSerializer
        elif self.action=="create":
            return UserFavSerializer

        return  UserFavDetailSerializer
    def get_queryset(self):
        #只能查看当前登录用户的收藏,不会获取所有用户的收藏
        return UserFav.objects.filter(user=self.request.user)

django第八天,个人中心功能开发_第3张图片
修改vue端中的host和用户收藏中接收的json文件中的字段
django第八天,个人中心功能开发_第4张图片
django第八天,个人中心功能开发_第5张图片
django第八天,个人中心功能开发_第6张图片

4.用户留言的功能
(1)同样先序列化
user_operation/serializers.py

class LeavingMessageSerializer(serializers.ModelSerializer):
    '''
    用户留言
    '''
    # 获取当前登录的用户
    user = serializers.HiddenField(
        default=serializers.CurrentUserDefault()
    )
    #read_only:只返回,post时候可以不用提交,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")

(2)user_operation/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)

(3)配置url

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

还是先查看messages 中数据的格式
django第八天,个人中心功能开发_第7张图片
修改vue中的host和vue中message组件中的字段
django第八天,个人中心功能开发_第8张图片
django第八天,个人中心功能开发_第9张图片
django第八天,个人中心功能开发_第10张图片
5.用户收获地址
(1)还是先序列化

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", "singer_name", "add_time", "signer_mobile")

这里的singer_name字段是在我创建model的时候手误写错了,于是就将错就错了

(2)user_operation/views.py

如果要实现增删改查功能,只要继承ModelViewSet就可以了

#如果要实现增删改查功能,只要继承ModelViewSet就可以了
class AddressViewset(viewsets.ModelViewSet):
    """
    收获地址管理
    list:获取收获地址
    create:添加收获地址
    updata:更新收获地址
    delete:删除收获地址
    """

    permission_classes = (IsAuthenticated,IsOwnerOrReadOnly)
    authentication_classes = (JSONWebTokenAuthentication,SessionAuthentication)
    serializer_class = AddressSerilaizer
    def get_queryset(self):
        return UserAddress.objects.filter(user=self.request.user)

(3)配置url

# 配置收货地址
router.register(r'address',AddressViewset , base_name="address")

同样先查看传输给前端的数据的格式
然后修改vue
django第八天,个人中心功能开发_第11张图片
django第八天,个人中心功能开发_第12张图片
django第八天,个人中心功能开发_第13张图片
django第八天,个人中心功能开发_第14张图片

你可能感兴趣的:(django)