商品菜单分类
一级菜单
menu/views
from django.http import HttpResponse
from django.shortcuts import render
from django.views import View
from apps_shop.menu.models import MainMenu
# Create your views
class GoodsMainMenu(View):
def get(self,request):
print('get')
# 获取表里的数据
main_menu=MainMenu.objects.all()
return HttpResponse(main_menu)
def post(self,request):
print('post')
return HttpResponse('post')
运行程序报错:RuntimeError: Model class apps_shop.menu.models.MainMenu doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
此时我们需要修改:menu/apps,将name加上我们文件夹的名字
class MenuConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps_shop.menu'
并且不要忘记在settings的INSTALLED_APPS里写上menu
获取成功:
手动序列化
因为我们发现get得到的结果的形式不是我们想要的,所以我们这里要对数据进行一些处理 menu/model
# 在GoodsMainMenu类当中添加
# 在这里我们自己手动序列化
def __str__(self):
result = {}
result['main_menu_id'] = self.main_menu_id
result["main_menu_name"] = self.main_menu_name
result["main_menu_url"] = self.main_menu_url
return json.dumps(result, ensure_ascii=False)
json.dumps()函数是将 Python 对象转换为 JSON 格式的字符串。其中,第一个参数result是要转换的 Python 对象,可以是字典、列表等可序列化的对象;第二个参数ensure_ascii=False可以保证输出中文
返回格式:
menu/view
class GoodsMainMenu(View):
def get(self, request):
print('get')
# 获取表里的数据
main_menu = MainMenu.objects.all()
result_list=[]
result_json={}
for m in main_menu:
result_list.append(m.__str__())
result_json['status']=1000
result_json['data']=result_list
return HttpResponse(json.dumps(result_json),content_type="application/json")
def post(self, request):
print('post')
return HttpResponse('post')
到此,就可以获得所需要的格式数据
二级菜单
二级菜单的逻辑和一级菜单逻辑差不多,多了一个,因为我们需要根据一级菜单的参数来请求二级菜单的名单,所以这里会多一个参数 menu/model
def __str__(self):
result = {}
result["main_menu_id"] = self.main_menu_id
result["sub_menu_id"] = self.sub_menu_id
result["sub_menu_type"] = self.sub_menu_type
result["sub_menu_name"] = self.sub_menu_name
return json.dumps(result, ensure_ascii=False)
menu/views
class GoodsSubMenu(View):
def get(self,request):
param_id=request.GET("main_menu_id")
sub_menu=SubMenu.objects.filter(main_menu_id=param_id)
result_list = []
result_json = {}
for m in sub_menu:
result_list.append(m.__str__())
result_json['status'] = 1000
result_json['data'] = result_list
return HttpResponse(json.dumps(result_json), content_type="application/json")
urls记得配置
from apps_shop.menu.views import GoodsMainMenu,GoodsSubMenu
urlpatterns = [
path('admin/', admin.site.urls),
path('main_menu/',GoodsMainMenu.as_view()),
path('sub_menu/',GoodsSubMenu.as_view())
]
as_view()
as_view是
封装一个统一响应的请求方法
根目录下新建一个utils,用来专门存放我们封装的工具
新建ResponseMessage:
import json
from django.http import HttpResponse
# 菜单成功的状态码1000
# 失败了1002
# 不确定1003
class MenuResponse():
@staticmethod
def success(data):
return HttpResponse(json.dumps({"status":1002,"data":data}), content_type="application/json")
@staticmethod
def failed(data):
return HttpResponse(json.dumps({"status":1002,"data":data}), content_type="application/json")
@staticmethod
def other(data):
return HttpResponse(json.dumps({"status":1002,"data":data}), content_type="application/json")
- @staticmethod:静态方法,这些方法可以直接通过类名调用,而无需创建类的实例
装饰器
可以在不必修改原始代码的情况下,动态地扩展、修改或包装函数或类的行为。 举个栗子:
def my_decorator(func):
def wrapper():
print("Before function execution")
func()
print("After function execution")
return wrapper
@my_decorator
def my_function():
print("Inside my_function")
my_function()
执行结果:
Before function execution
Inside my_function
After function execution
问题:
TypeError: dump() missing 1 required positional argument: 'fp'
解决:报错是因为json.dumps写错了,写成json.dump了