天天看點

Django 前後端分離實戰項目 生鮮超市(十)之使用者收藏

使用者收藏

前言

所有vue接口全部在src/api/api.js檔案下

代碼已上傳至github:https://github.com/kalipoison/fresh-market

此項目僅學習用途

要求
Package                 Version
----------------------- ----------
certifi                 2020.4.5.1
chardet                 3.0.4
coreapi                 2.3.1
coreschema              0.0.4
Django                  1.11.3
django-cors-headers     2.1.0
django-crispy-forms     1.6.1
django-filter           1.0.4
django-formtools        2.0
django-guardian         1.4.9
django-reversion        2.0.9
djangorestframework     3.6.3
djangorestframework-jwt 1.11.0
future                  0.16.0
httplib2                0.9.2
idna                    2.9
itypes                  1.2.0
Jinja2                  2.11.2
Markdown                2.6.8
MarkupSafe              1.1.1
mysqlclient             1.3.10
olefile                 0.46
Pillow                  4.2.1
pip                     20.0.2
PyJWT                   1.7.1
pytz                    2019.3
requests                2.23.0
setuptools              46.1.3
six                     1.10.0
uritemplate             3.0.1
urllib3                 1.25.9
wheel                   0.34.2
XlsxWriter              0.9.8
xlwt                    1.2.0

           
流程

在user_operation檔案夾下views.py代碼如下:

views.py

from rest_framework import viewsets
from rest_framework import mixins
from rest_framework.permissions import IsAuthenticated
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
from rest_framework.authentication import SessionAuthentication

# Create your views here.

from .models import UserFav, UserLeavingMessage, UserAddress
from utils.permissions import IsOwnerOrReadOnly
from .serializers import UserFavSerializer, UserFavDetailSerializer, AddressSerializer, LeavingMessageSerializer



class UserFavViewset(mixins.CreateModelMixin, mixins.ListModelMixin, mixins.RetrieveModelMixin,
                     mixins.DestroyModelMixin, viewsets.GenericViewSet):
    """
    list:
        擷取使用者收藏清單
    retrieve:
        判斷某個商品是否已經收藏
    create:
        收藏商品
    """
    serializer_class = UserFavSerializer
    permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
    authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
    lookup_field = "goods_id"

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

在user_operation檔案夾下serializers.py代碼如下:

serializers.py

from rest_framework import serializers
from rest_framework.validators import UniqueTogetherValidator

from .models import UserFav
from .models import UserLeavingMessage, UserAddress
from goods.serializers import GoodsSerializer



class UserFavSerializer(serializers.ModelSerializer):
    user = serializers.HiddenField(
        default=serializers.CurrentUserDefault()
    )

    class Meta:
        model = UserFav
        validators = [
            UniqueTogetherValidator(
                queryset=UserFav.objects.all(),
                fields=('user', 'goods'),
                message="已經收藏"
            )
        ]

        fields = ("user", "goods", "id")

           

在utils檔案夾下建立permissions.py

permissions.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
           

url.py

from django.conf.urls import url,include
# from django.contrib import admin
import xadmin
from Mxshop.settings import MEDIA_ROOT
from django.views.static import serve
from rest_framework.documentation import include_docs_urls
from rest_framework.routers import DefaultRouter
from rest_framework.authtoken import views
from rest_framework_jwt.views import obtain_jwt_token

from goods.views import GoodsListViewSet,CategoryViewset,HotSearchsViewset
from users.views import SmsCodeViewset,UserViewset
from user_operation.views import UserFavViewset

router = DefaultRouter()

#配置goods的url
router.register(r'goods', GoodsListViewSet, base_name="goods")

#配置category的url
router.register(r'categorys', CategoryViewset, base_name="categorys")

router.register(r'codes', SmsCodeViewset, base_name="codes")

router.register(r'hotsearchs', HotSearchsViewset, base_name="hotsearchs")

router.register(r'users', UserViewset, base_name="users")

#收藏
router.register(r'userfavs', UserFavViewset, base_name="userfavs")


goods_list = GoodsListViewSet.as_view({
    'get': 'list',
})

urlpatterns = [
    url(r'^xadmin/', xadmin.site.urls),
    url(r'^media/(?P<path>.*)$', serve, {"document_root": MEDIA_ROOT}),

    url(r'^', include(router.urls)),

    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),

    url(r'docs/',include_docs_urls(title='GOHB生鮮')),

    # drf自帶的token認證模式
    url(r'^api-token-auth/', views.obtain_auth_token),

    # jwt的認證接口
    url(r'^login/', obtain_jwt_token),
]
           

修改api.js下ip位址

Django 前後端分離實戰項目 生鮮超市(十)之使用者收藏

點選收藏

Django 前後端分離實戰項目 生鮮超市(十)之使用者收藏

收藏成功

Django 前後端分離實戰項目 生鮮超市(十)之使用者收藏