目录

生鲜超市(一)    生鲜超市(二)    生鲜超市(三)

生鲜超市(四)    生鲜超市(五)    生鲜超市(六)

生鲜超市(七)    生鲜超市(八)    生鲜超市(九)

生鲜超市(十)    生鲜超市(十一)    生鲜超市(十二)    生鲜超市(十三)

代码下载

github

教程

学习自慕课网-前端vue结合后端DjangoFramework的在线生鲜超市

九、个人中心功能开发

9.1.drf的api文档自动生成

(1) url

  1. #drf文档,title自定义
  2. path('docs',include_docs_urls(title='仙剑奇侠传')),

访问:http://127.0.0.1:8000/docs  就可以自动生成

(2)drf文档的优点:

  • 自动生成
  • 文档里可以做交互和测试
  • 可以生成js,shell和python代码段

(3)代码中注释的格式:

ViewSet的格式,更多请看官方文档

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

(4)Description

添加字段的描述有三种方式:

  • model的字段中加
  • serializer的字段加
  • filter中也可以加

9.2.动态设置serializer和permission获取用户信息

用户个人信息修改,因为手机号是验证过的,不能随便改

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

(1)用户详情的序列化

users/serializers.py

  1. class UserDetailSerializer(serializers.ModelSerializer):
  2. """
  3. 用户详情
  4. """
  5. class Meta:
  6. model = User
  7. fields = ("name", "gender", "birthday", "email","mobile")

(2)users/views.py

  1. class UserViewset(CreateModelMixin,mixins.RetrieveModelMixin,viewsets.GenericViewSet):
  2. '''
  3. 用户
  4. '''
  5. serializer_class = UserRegSerializer
  6. queryset = User.objects.all()
  7. authentication_classes = (JSONWebTokenAuthentication, authentication.SessionAuthentication)
  8.  
  9. def create(self, request, *args, **kwargs):
  10. serializer = self.get_serializer(data=request.data)
  11. serializer.is_valid(raise_exception=True)
  12. user = self.perform_create(serializer)
  13. re_dict = serializer.data
  14. payload = jwt_payload_handler(user)
  15. re_dict["token"] = jwt_encode_handler(payload)
  16. re_dict["name"] = user.name if user.name else user.username
  17.  
  18. headers = self.get_success_headers(serializer.data)
  19.  
  20. return Response(re_dict, status=status.HTTP_201_CREATED, headers=headers)
  21.  
  22. #这里需要动态权限配置
  23. #1.用户注册的时候不应该有权限限制
  24. #2.当想获取用户详情信息的时候,必须登录才行
  25. def get_permissions(self):
  26. if self.action == "retrieve":
  27. return [permissions.IsAuthenticated()]
  28. elif self.action == "create":
  29. return []
  30.  
  31. return []
  32.  
  33. #这里需要动态选择用哪个序列化方式
  34. #1.UserRegSerializer(用户注册),只返回username和mobile,会员中心页面需要显示更多字段,所以要创建一个UserDetailSerializer
  35. #2.问题又来了,如果注册的使用userdetailSerializer,又会导致验证失败,所以需要动态的使用serializer
  36. def get_serializer_class(self):
  37. if self.action == "retrieve":
  38. return UserDetailSerializer
  39. elif self.action == "create":
  40. return UserRegSerializer
  41.  
  42. return UserDetailSerializer
  43.  
  44. #虽然继承了Retrieve可以获取用户详情,但是并不知道用户的id,所有要重写get_object方法
  45. #重写get_object方法,就知道是哪个用户了
  46. def get_object(self):
  47. return self.request.user
  48.  
  49. def perform_create(self, serializer):
  50. return serializer.save()

主要添加的内容:

  • 继承mixins.RetrieveModelMixin   -->>获取用户信息
  • 重写get_object                              -->>获取登录的用户
  • get_permissions                           -->>动态权限分配
  • get_serializer_class                     -->>动态序列化分配

现在就可以从数据库获取用户的信息了

用户个人信息修改

只需要多添加一个继承mixins.UpdateModelMixin就可以了

  1. class UserViewset(CreateModelMixin,mixins.RetrieveModelMixin,mixins.UpdateModelMixin,viewsets.GenericViewSet):

9.3.用户收藏

(1)用户收藏商品详情

user_operation/serializer.py中添加

  1. class UserFavDetailSerializer(serializers.ModelSerializer):
  2. '''
  3. 用户收藏详情
  4. '''
  5.  
  6. #通过商品id获取收藏的商品,需要嵌套商品的序列化
  7. goods = GoodsSerializer()
  8. class Meta:
  9. model = UserFav
  10. fields = ("goods", "id")

(2)user_operation/views.py

动态设置serializer

  1. #动态选择serializer
  2. def get_serializer_class(self):
  3. if self.action == "list":
  4. return UserFavDetailSerializer
  5. elif self.action == "create":
  6. return UserFavSerializer
  7. return UserFavSerializer
  1. # user_operaton/views.py
  2.  
  3. from rest_framework import viewsets
  4. from rest_framework import mixins
  5. from .models import UserFav
  6. from .serializers import UserFavSerializer,UserFavDetailSerializer
  7. from rest_framework.permissions import IsAuthenticated
  8. from utils.permissions import IsOwnerOrReadOnly
  9. from rest_framework_jwt.authentication import JSONWebTokenAuthentication
  10. from rest_framework.authentication import SessionAuthentication
  11.  
  12. class UserFavViewset(viewsets.GenericViewSet, mixins.ListModelMixin, mixins.CreateModelMixin, mixins.DestroyModelMixin):
  13. '''
  14. 用户收藏
  15. '''
  16. #permission是用来做权限判断的
  17. # IsAuthenticated:必须登录用户;IsOwnerOrReadOnly:必须是当前登录的用户
  18. permission_classes = (IsAuthenticated,IsOwnerOrReadOnly)
  19. #auth使用来做用户认证的
  20. authentication_classes = (JSONWebTokenAuthentication,SessionAuthentication)
  21. #搜索的字段
  22. lookup_field = 'goods_id'
  23.  
  24. #动态选择serializer
  25. def get_serializer_class(self):
  26. if self.action == "list":
  27. return UserFavDetailSerializer
  28. elif self.action == "create":
  29. return UserFavSerializer
  30. return UserFavSerializer
  31.  
  32. def get_queryset(self):
  33. #只能查看当前登录用户的收藏,不会获取所有用户的收藏
  34. return UserFav.objects.filter(user=self.request.user)

serializer.py

在会员中心可以看到已收藏的商品以及详细信息,点删除,可以删除对应的商品

9.4.用户留言功能

(1)user_operation/serializers.py

  1. class LeavingMessageSerializer(serializers.ModelSerializer):
  2. '''
  3. 用户留言
  4. '''
  5. # 获取当前登录的用户
  6. user = serializers.HiddenField(
  7. default=serializers.CurrentUserDefault()
  8. )
  9. #read_only:只返回,post时候可以不用提交,format:格式化输出
  10. add_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M')
  11. class Meta:
  12. model = UserLeavingMessage
  13. fields = ("user", "message_type", "subject", "message", "file", "id" ,"add_time")

(2)user_operation/views.py

  1. class LeavingMessageViewset(mixins.ListModelMixin, mixins.DestroyModelMixin, mixins.CreateModelMixin,
  2. viewsets.GenericViewSet):
  3. """
  4. list:
  5. 获取用户留言
  6. create:
  7. 添加留言
  8. delete:
  9. 删除留言功能
  10. """
  11.  
  12. permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
  13. authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
  14. serializer_class = LeavingMessageSerializer
  15.  
  16. # 只能看到自己的留言
  17. def get_queryset(self):
  18. return UserLeavingMessage.objects.filter(user=self.request.user)

(3)配置url

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

可以获取、删除留言等功能

9.5.用户收获地址

(1)user_operation/serializers.py

  1. class AddressSerializer(serializers.ModelSerializer):
  2. user = serializers.HiddenField(
  3. default=serializers.CurrentUserDefault()
  4. )
  5. add_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M')
  6.  
  7. class Meta:
  8. model = UserAddress
  9. fields = ("id", "user", "province", "city", "district", "address", "signer_name", "add_time", "signer_mobile")

(2)user_operation/views.py

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

  1. class AddressViewset(viewsets.ModelViewSet):
  2. """
  3. 收货地址管理
  4. list:
  5. 获取收货地址
  6. create:
  7. 添加收货地址
  8. update:
  9. 更新收货地址
  10. delete:
  11. 删除收货地址
  12. """
  13. permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
  14. authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
  15. serializer_class = AddressSerializer
  16.  
  17. def get_queryset(self):
  18. return UserAddress.objects.filter(user=self.request.user)

(3)配置url

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

Django REST framework+Vue 打造生鲜超市(八)的更多相关文章

  1. Django REST framework+Vue 打造生鲜超市(三)

    四.xadmin后台管理 4.1.xadmin添加富文本插件 (1)xadmin/plugins文件夹下新建文件ueditor.py 代码如下: # xadmin/plugins/ueditor.py ...

  2. Django REST framework+Vue 打造生鲜超市(四)

    五.商品列表页 5.1.django的view实现商品列表页 (1)goods/view_base.py 在goods文件夹下面新建view_base.py,为了区分django和django res ...

  3. Django REST framework+Vue 打造生鲜超市(五)

    六.商品类别数据展示 6.1. 商品类别数据接口 (1)商品分类有两个接口: 一种是全部分类:一级二级三级 一种是某一类的分类以及商品详细信息: 开始写商品分类的接口 (2)序列化 给分类添加三级分类 ...

  4. Django REST framework+Vue 打造生鲜超市(十二)

    十三.首页.商品数量.缓存和限速功能开发  13.1.轮播图接口实现 首先把pycharm环境改成本地的,vue中local_host也改成本地 (1)goods/serializer class B ...

  5. Django REST framework+Vue 打造生鲜超市(七)

    目录 生鲜超市(一)    生鲜超市(二)    生鲜超市(三) 生鲜超市(四)    生鲜超市(五)    生鲜超市(六) 生鲜超市(七)    生鲜超市(八)    生鲜超市(九) 生鲜超市(十) ...

  6. Django REST framework+Vue 打造生鲜超市(一)

    一.项目介绍 1.1.掌握的技术 Vue + Django Rest Framework 前后端分离技术 彻底玩转restful api 开发流程 Django Rest Framework 的功能实 ...

  7. Django REST framework+Vue 打造生鲜超市(二)

    三.Models设计 3.1.项目初始化 (1)进虚拟环境下安装 django2.0.2 djangorestframework和相关依赖mark,filter pillow  图片处理 pip in ...

  8. Django REST framework+Vue 打造生鲜超市(六)

    七.用户登录与手机注册 7.1.drf的token (1)INSTALL_APP中添加 INSTALLED_APPS = ( ... 'rest_framework.authtoken' ) toke ...

  9. Django REST framework+Vue 打造生鲜超市(十)

    十一.pycharm远程代码调试 第三方登录和支付,都需要有服务器才行(回调url),我们可以用pycharm去远程调试服务器代码 服务器环境搭建 以全新阿里云centos7系统为例: 11.1.阿里 ...

随机推荐

  1. Lombok介绍、使用方法和总结

    1 Lombok背景介绍 官方介绍如下: Project Lombok makes java a spicier language by adding 'handlers' that know how ...

  2. Bootstrap3 datetimepicker控件的使用

    Bootstrap3 日期+时间选择控件 1.支持日期选择,格式设定 2.支持时间选择 3.支持时间段选择控制 4.支持中文 官网地址:http://eonasdan.github.io/bootst ...

  3. LeetCode --> 771. Jewels and Stones

    Jewels and Stones You're given strings J representing the types of stones that are jewels, and S rep ...

  4. 使用SQLiteOpenHelper类对数据库简单操作

    实现数据库基本操作       数据库创建的问题解决了,接下来就该使用数据库实现应用程序功能的时候了.基本的操作包括创建.读取.更新.删除,即我们通常说的CRUD(Create, Read, Upda ...

  5. JavaScript(第二十七天)【错误处理与调试】

    JavaScript在错误处理调试上一直是它的软肋,如果脚本出错,给出的提示经常也让人摸不着头脑.ECMAScript第3版为了解决这个问题引入了try...catch和throw语句以及一些错误类型 ...

  6. oracle导出dmp文件的2种方法

    使用exp和expdp导出数据 1.exp导出数据命令 exp gd_base/@192.168.13.211/oanet file=D:\export\gd_base.dmp log=D:\expo ...

  7. C语言指针作业

    一.PTA实验作业 题目1:6-5 判断回文字符串 1. 本题PTA提交列表 2. 设计思路 3.代码截图 4.本题调试过程碰到问题及PTA提交列表情况说明. 第一次做的时候我j直接等于count,其 ...

  8. NetFPGA-1G-CML Demo --- openflow_switch

    环境 ubuntu 14.04 vivado 15.2 ise 14.6 更多基础配置:http://www.cnblogs.com/wpqwpq/p/6771568.html 运行步骤 step1: ...

  9. 201421123042 《Java程序设计》第12周

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 面向系统综合设计-图书馆管理系统或购物车 使用流与文件改造你的图书馆管理系统或购物车. 2.1 简述如何 ...

  10. Flask 学习 十四 测试

    获取代码覆盖报告 安装代码覆盖工具 pip install coverage manage.py 覆盖检测 COV = None if os.environ.get('FLASK_COVERAGE') ...