Skip to content

Commit 162e01b

Browse files
committed
完成了djangofilter以及restframework的源码安装以及汉化。对于搜索排序,过滤进行了学习。完成了类别数据接口,完成vue展示商品分类数据,完成商品列表页,完成商品搜素功能。
1 parent d00846b commit 162e01b

File tree

316 files changed

+48805
-7
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

316 files changed

+48805
-7
lines changed

VueDjangoFrameWorkShop/settings.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,12 @@
4949
'crispy_forms',
5050
'DjangoUeditor',
5151
'rest_framework',
52+
'django_filters',
53+
'corsheaders',
5254
]
5355

5456
MIDDLEWARE = [
57+
'corsheaders.middleware.CorsMiddleware',
5558
'django.middleware.security.SecurityMiddleware',
5659
'django.contrib.sessions.middleware.SessionMiddleware',
5760
'django.middleware.common.CommonMiddleware',
@@ -61,6 +64,11 @@
6164
'django.middleware.clickjacking.XFrameOptionsMiddleware',
6265
]
6366

67+
CORS_ORIGIN_ALLOW_ALL = True
68+
CORS_ORIGIN_WHITELIST = (
69+
'127.0.0.1:3000'
70+
)
71+
6472
ROOT_URLCONF = 'VueDjangoFrameWorkShop.urls'
6573

6674
TEMPLATES = [

VueDjangoFrameWorkShop/urls.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
from django.urls import path, re_path, include
2222

2323
from VueDjangoFrameWorkShop.settings import MEDIA_ROOT
24-
from goods.views import GoodsListViewSet
24+
from goods.views import GoodsListViewSet, CategoryViewset
2525
# from goods.views import GoodsListView,
2626
# from goods.views_base import GoodsListView
2727
from rest_framework.routers import DefaultRouter
@@ -31,8 +31,11 @@
3131
# })
3232
router = DefaultRouter()
3333

34-
# 配置goods的url
35-
router.register(r'goods', GoodsListViewSet)
34+
# 配置goods的url,这个basename是干啥的
35+
router.register(r'goods', GoodsListViewSet, base_name="goods")
36+
37+
# 配置Category的url
38+
router.register(r'categories', CategoryViewset, base_name="categories")
3639

3740
urlpatterns = [
3841
# path('admin/', admin.site.urls),

apps/goods/filters.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# -*- coding:utf-8 _*-
2+
from django.db.models import Q
3+
4+
__author__ = 'mtianyan'
5+
__date__ = '2018/03/03 00:44'
6+
7+
from django_filters import rest_framework as filters
8+
from goods.models import Goods
9+
from django.utils.translation import ugettext_lazy as _
10+
11+
12+
class GoodsFilter(filters.FilterSet):
13+
"""
14+
商品的过滤类
15+
"""
16+
# 指定字段以及字段上的行为,在shop_price上大于等于
17+
pricemin = filters.NumberFilter(name="shop_price", lookup_expr='gte', help_text=_('大于等于本店价格'))
18+
pricemax = filters.NumberFilter(name="shop_price", lookup_expr='lte', help_text=_('小于等于本店价格'))
19+
# 行为: 名称中包含某字符,且字符不区分大小写
20+
# name = filters.CharFilter(name="name" ,lookup_expr="icontains")
21+
top_category = filters.NumberFilter(name="category",method='top_category_filter')
22+
23+
def top_category_filter(self, queryset, name, value):
24+
# 不管当前点击的是一级目录二级目录还是三级目录。
25+
return queryset.filter(Q(category_id=value)|Q(category__parent_category_id=value)|Q(category__parent_category__parent_category_id=value))
26+
27+
class Meta:
28+
model = Goods
29+
fields = ['pricemin', 'pricemax', 'name']
30+
# fields = {
31+
# 'shop_price': ['gte','lte', 'icontains'],
32+
# }
33+
34+

apps/goods/serializers.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,33 @@ class GoodsSerializer(serializers.ModelSerializer):
1818
class Meta:
1919
model = Goods
2020
# fields = ('category', 'goods_sn', 'name', 'click_num', 'sold_num', 'market_price')
21+
fields = "__all__"
22+
23+
24+
class CategorySerializer3(serializers.ModelSerializer):
25+
"""
26+
商品三级类别序列化
27+
"""
28+
class Meta:
29+
model = GoodsCategory
30+
fields = "__all__"
31+
32+
33+
class CategorySerializer2(serializers.ModelSerializer):
34+
"""
35+
商品二级类别序列化
36+
"""
37+
sub_cat = CategorySerializer3(many=True)
38+
class Meta:
39+
model = GoodsCategory
40+
fields = "__all__"
41+
42+
43+
class CategorySerializer(serializers.ModelSerializer):
44+
"""
45+
商品一级类别序列化
46+
"""
47+
sub_cat = CategorySerializer2(many=True)
48+
class Meta:
49+
model = GoodsCategory
2150
fields = "__all__"

apps/goods/views.py

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,15 @@
66
from rest_framework.pagination import PageNumberPagination
77
from rest_framework.response import Response
88
from rest_framework.views import APIView
9-
from goods.serializers import GoodsSerializer
10-
from .models import Goods
9+
10+
from goods.filters import GoodsFilter
11+
from goods.serializers import GoodsSerializer, CategorySerializer
12+
from .models import Goods, GoodsCategory
1113
from rest_framework import mixins
1214
from rest_framework import generics
1315
from rest_framework import viewsets
16+
from rest_framework import filters
17+
from django_filters.rest_framework import DjangoFilterBackend
1418

1519

1620
# 商品列表分页类
@@ -28,13 +32,42 @@ class GoodsPagination(PageNumberPagination):
2832
# class GoodsListView(mixins.ListModelMixin, viewsets.GenericViewSet):
2933
class GoodsListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
3034
"""
31-
商品列表页
35+
商品列表页,分页,搜索,过滤,排序
3236
"""
33-
queryset = Goods.objects.all()
37+
38+
# queryset是一个属性
39+
# good_viewset.queryset就可以访问到
40+
# 函数就必须调用good_viewset.get_queryset()函数
41+
# 如果有了下面的get_queryset。那么上面的这个就不需要了。
42+
# queryset = Goods.objects.all()
43+
44+
45+
3446
serializer_class = GoodsSerializer
3547
pagination_class = GoodsPagination
48+
queryset = Goods.objects.all()
3649

50+
# 设置三大常用过滤器之DjangoFilterBackend, SearchFilter
51+
filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter)
52+
# 设置排序
53+
ordering_fields = ('sold_num', 'shop_price')
54+
# 设置filter的类为我们自定义的类
55+
filter_class = GoodsFilter
3756

57+
# 设置我们的search字段
58+
search_fields = ('name', 'goods_brief', 'goods_desc')
59+
60+
# 设置我们需要进行过滤的字段
61+
# filter_fields = ('name', 'shop_price')
62+
63+
64+
65+
# def get_queryset(self):
66+
# # 价格大于100的
67+
# price_min = self.request.query_params.get('price_min', 0)
68+
# if price_min:
69+
# self.queryset = Goods.objects.filter(shop_price__gt=int(price_min)).order_by('-add_time')
70+
# return self.queryset
3871
# class GoodsListView(APIView):
3972
# """
4073
# 列出所有商品
@@ -52,3 +85,13 @@ class GoodsListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
5285
# return Response(serializer.data, status=status.HTTP_201_CREATED)
5386
# return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
5487

88+
89+
class CategoryViewset(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
90+
"""
91+
list:
92+
商品分类列表数据
93+
retrieve:
94+
获取商品分类详情
95+
"""
96+
queryset = GoodsCategory.objects.filter(category_type=1)
97+
serializer_class = CategorySerializer
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# flake8: noqa
2+
from __future__ import absolute_import
3+
4+
import pkgutil
5+
6+
from .constants import STRICTNESS
7+
from .filterset import FilterSet
8+
from .filters import *
9+
10+
# We make the `rest_framework` module available without an additional import.
11+
# If DRF is not installed, no-op.
12+
if pkgutil.find_loader('rest_framework') is not None:
13+
from . import rest_framework
14+
del pkgutil
15+
16+
__version__ = '1.1.0'
17+
18+
19+
def parse_version(version):
20+
'''
21+
'0.1.2-dev' -> (0, 1, 2, 'dev')
22+
'0.1.2' -> (0, 1, 2)
23+
'''
24+
v = version.split('.')
25+
v = v[:-1] + v[-1].split('-')
26+
ret = []
27+
for p in v:
28+
if p.isdigit():
29+
ret.append(int(p))
30+
else:
31+
ret.append(p)
32+
return tuple(ret)
33+
34+
VERSION = parse_version(__version__)
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
2+
from __future__ import absolute_import
3+
4+
import django
5+
from django.conf import settings
6+
from django.utils.timezone import make_aware as make_aware_orig
7+
8+
try:
9+
from django.forms.utils import pretty_name
10+
except ImportError: # Django 1.8
11+
from django.forms.forms import pretty_name
12+
13+
# django-crispy-forms is optional
14+
try:
15+
import crispy_forms
16+
except ImportError:
17+
crispy_forms = None
18+
19+
20+
def is_crispy():
21+
return 'crispy_forms' in settings.INSTALLED_APPS and crispy_forms
22+
23+
24+
# coreapi is optional (Note that uritemplate is a dependency of coreapi)
25+
# Fixes #525 - cannot simply import from rest_framework.compat, due to
26+
# import issues w/ django-guardian.
27+
try:
28+
import coreapi
29+
except ImportError:
30+
coreapi = None
31+
32+
try:
33+
import coreschema
34+
except ImportError:
35+
coreschema = None
36+
37+
def remote_field(field):
38+
"""
39+
https://docs.djangoproject.com/en/1.9/releases/1.9/#field-rel-changes
40+
"""
41+
if django.VERSION >= (1, 9):
42+
return field.remote_field
43+
return field.rel
44+
45+
46+
def remote_model(field):
47+
if django.VERSION >= (1, 9):
48+
return remote_field(field).model
49+
return remote_field(field).to
50+
51+
52+
def remote_queryset(field):
53+
model = remote_model(field)
54+
limit_choices_to = field.get_limit_choices_to()
55+
56+
return model._default_manager.complex_filter(limit_choices_to)
57+
58+
59+
def format_value(widget, value):
60+
if django.VERSION >= (1, 10):
61+
return widget.format_value(value)
62+
return widget._format_value(value)
63+
64+
65+
66+
def make_aware(value, timezone, is_dst):
67+
"""is_dst was added for 1.9"""
68+
if django.VERSION >= (1, 9):
69+
return make_aware_orig(value, timezone, is_dst)
70+
else:
71+
return make_aware_orig(value, timezone)

0 commit comments

Comments
 (0)