def put(self, request, group_id): # 1. 拿到要修改的分组 group = Group.objects.filter(id=group_id).first() # 1.1 判断是否不存在 if not group: return json_response(errno=Code.NODATA, errmsg='该分组不存在') # 2. 拿到前端传递的参数 put_data = QueryDict(request.body) # 3. 校验参数 # 3.1 创建表单对象 form = GroupModelForm(put_data, instance=group) if form.is_valid(): # 4. 如果成功,保存数据 form.save() return json_response(errmsg='修改分组成功!') else: # 拿到所有可用一级菜单 menus = Menu.objects.only( 'name', 'permission_id').select_related('permission').filter( is_deleted=False, is_visible=True, parent=None) # 拿到当前组的可用权限 permissions = group.permissions.only('id').all() # 渲染包含错误提示的页面 return render(request, 'myadmin/group/group_detail.html', context={ 'form': form, 'menus': menus, 'permissions': permissions })
def delete(self, request, menu_id): menu = Menu.objects.filter(id=menu_id).only('name') # 没用first方法返回查询集 if menu: menu = menu[0] # 验证是否为父菜单 if menu.children.filter().exists(): return json_response(errno=Code.DATAERR, errmsg='父菜单不能删除!') menu.permission.delete() # 级联删除,删除了permission,menu也会被删除 return json_response(errmsg='成功删除菜单%s!' % menu.name) else: return json_response(errno=Code.NODATA, errmsg='菜单不存在!')
def post(self, request): # 1. 先校验 form = LoginForm(request.POST, request=request) if form.is_valid(): return json_response(errmsg='恭喜登录成功') else: # 将表单的报错信息进行拼接 error_msg_list = [] for item in form.errors.values(): error_msg_list.append(item[0]) error_msg_str = '/'.join(error_msg_list) return json_response(errno=Code.PARAMERR, errmsg=error_msg_str)
def get(self, request): banners = Banner.objects.values( 'image_url', 'article__act_num').annotate( article_title=F('article__act_name')).filter( is_delete=False)[:constants.SHOW_BANNER_COUNT] data = {'banners': list(banners)} return json_res.json_response(data=data)
def handle_no_permission(self): """ 覆盖父类方法,解决ajax返回json数据的问题 """ # 没有权限有两种情况 if self.request.is_ajax(): # 如果请求是ajax # 1.登录了,但用户没有权限 if self.request.user.is_authenticated: return json_response(errno=Code.ROLEERR, errmsg='您没有权限!') # 2.没有登录 else: return json_response( errno=Code.SESSIONERR, errmsg='您未登录,请登录!', data={'url': reverse(self.get_login_url())}) else: return super().handle_no_permission()
def get(self, request): banners = Banner.objects.values( 'image_url', 'news_id').annotate(news_title=F('news__title')).filter( is_deleted=False)[:constants.SHOW_BANNER_COUNT] data = {'banners': list(banners)} return json_response(data=data)
def get(self, request, user_id): user = User.objects.filter(id=user_id).first() if user: form = UserModelForm( instance=user) # 将拿到的user传入django的modelForm对象处理 else: return json_response(errno=Code.NODATA, errmsg='找不到此用户!') return render(request, 'myadmin/user/user_detail.html', context={'form': form})
def put(self, request, news_id): # 1. 拿到的要修改的对象 news = News.objects.filter(id=news_id).first() if not news: return json_response(errno=Code.NODATA, errmsg='没有此新闻!') # 2. 获取put的数据 put_data = QueryDict(request.body) # 3. 创建模型表单 form = NewsModelForm(put_data, instance=news) # 4. 校验表单 if form.is_valid(): # 5. 如果成功,则保存数据并返回 form.save() return json_response(errmsg='修改成功!') else: # 6. 如果失败,返回渲染错误信息的html return render(request, 'myadmin/news/news_detail.html', context={'form': form})
def post(self, request): try: file = request.FILES['upload'] filename = get_filename(file.name) file_path = os.path.join(settings.MEDIA_ROOT, filename) with open(file_path, 'wb') as f: for chunk in file.chunks(): # file封装的文件对象 f.write(chunk) return json_response( data={ 'url': settings.MEDIA_URL + filename, 'name': filename, 'uploaded': '1' }) except Exception as e: logger.error('上传文件失败:[%s]' % e) return json_response(data={'uploaded': '0'})
def put(self, request, user_id): # 1. 拿到要修改的用户对象 user = User.objects.filter(id=user_id).first() # 1.1 判断用户是否存在 if not user: return json_response(errno=Code.NODATA, errmsg='找不到该用户') # 2. 拿到前端传递的参数 put_data = QueryDict(request.body) # 3. 校验参数 # 3.1 创建表单对象 form = UserModelForm(put_data, instance=user) # 4. 如果成功,保存数据 if form.is_valid(): form.save() return json_response(errmsg='用户修改成功!') # 5. 如果不成功,返回渲染了错误提示信息的页面 else: return render(request, 'myadmin/user/user_detail.html', context={'form': form})
def get(self, request, news_id): # 1. 拿到对应的新闻对象 news = News.objects.filter(id=news_id).first() if news: # 2. 生成表单对象 form = NewsModelForm(instance=news) else: return json_response(errno=Code.NODATA, errmsg='没有此新闻!') # 3. 渲染并返回 return render(request, 'myadmin/news/news_detail.html', context={'form': form})
def post(self, request): # 1. 校验数据 form = RegisterForm(request.POST) if form.is_valid(): # 创建数据 username = form.cleaned_data.get('username') password = form.cleaned_data.get('password') mobile = form.cleaned_data.get('mobile') # 创建对象 # User.objects.create(username=username, password=password, mobile=mobile) # 这种方法会向数据库存入明文密码 User.objects.create_user(username=username, password=password, mobile=mobile) # django自带方法,给密码加密 return json_response(errmsg="恭喜您,注册成功!") else: # 将表单的报错信息进行拼接 error_msg_list = [] for item in form.errors.values(): error_msg_list.append(item[0]) error_msg_str = '/'.join(error_msg_list) return json_response(errno=Code.PARAMERR, errmsg=error_msg_str)
def get(self, request): # 1. 拿到所有文档 docs = Doc.objects.values('file_url', 'file_name', 'title', 'desc', 'image_url').filter(is_deleted=False) # 2. 分页 paginator = Paginator(docs, constants.PER_PAGE_DOC_COUNT) try: page = paginator.get_page(int(request.GET.get('page'))) except Exception as e: page = paginator.get_page(1) # 3. 序列化 data = {'total_page': paginator.num_pages, 'docs': list(page)} # 4. 返回json响应 return json_response(data=data)
def put(self, request, **kwargs): # 1. 获取模型对象 self.obj = self.get_obj(**kwargs) # 2. 获取参数,创建模型表单对象 self.form_class = self.get_form_class() form = self.form_class(QueryDict(request.body), instance=self.obj) # 3. 校验 if form.is_valid(): self.save(form) return json_response(errmsg='修改数据成功!') else: return render(request, self.get_template_name(), context=self.get_context_data(form=form))
def get(self, request): # 1. 判断前端传递标签分类id是否为空,是否为整数,是否超过范围 # 2. 判断前端传递当前文章页数是否为空,是否为整数,是否超过范围 try: tag_id = int(request.GET.get('tag', 0)) except Exception as e: logger.error('标签错误:\n{}'.format(e)) tag_id = 0 try: page = int(request.GET.get('page', 1)) except Exception as e: logger.error('页码错误:\n{}'.format(e)) page = 1 # 使用only返回的是对象,所以传递到前端时需要迭代处理 news_queryset = News.objects.select_related('tag', 'author').only( 'title', 'digest', 'image_url', 'update_time', 'tag__name', 'author__username') # values 返回字典 # news_queryset = News.objects.values('id', 'title', 'digest', 'image_url', 'update_time'). \ # annotate(tag_name=F('tag__name'), author=F('author__username')) news = news_queryset.filter(is_delete=False, tag_id=tag_id) or \ news_queryset.filter(is_delete=False) paginator = Paginator(news, constants.PER_PAGE_NEWS_COUNT) try: # 获取页面数据 get_page可以容错 news_info = paginator.get_page(page) except EmptyPage: logging.info("用户访问的页数大于总页数") news_info = paginator.get_page(paginator.num_pages) # 序列化数据 news_info_list = [] for n in news_info: news_info_list.append({ 'id': n.id, 'title': n.title, 'digest': n.digest, 'image_url': n.image_url, 'tag_name': n.tag.name, 'author': n.author.username, 'update_time': n.update_time.strftime('%Y年%m月%d日 %H:%M') }) data = { 'total_pages': paginator.num_pages, 'news': news_info_list # 'news': list(news_info) } return json_response(data=data)
def put(self, request, menu_id): menu = Menu.objects.filter(id=menu_id).first() if not menu: return json_response(errno=Code.NODATA, errmsg="菜单不存在!") # 获取put请求参数 put_data = QueryDict(request.body) # put请求获取数据的方法和post不一样 form = MenuModelForm(put_data, instance=menu) # instance传入要修改的对象 if form.is_valid(): obj = form.save() # 检查修改了的字段是否和权限有关 flag = False if 'name' in form.changed_data: # form.changed_data:有变动的字段 obj.permission.name = obj.name # 修改对应permission中的name字段 flag = True if 'codename' in form.changed_data: obj.permission.codename = obj.codename flag = True if flag: # 如果有改动,才存储相应对象 obj.permission.save() return json_response(errmsg="菜单修改成功!") else: return render(request, 'myadmin/menu/update_menu.html', context={'form': form}) # 如有异常渲染错误提示页面{% error %}
def post(self, request): # 1. 接收数据并创建模型表单对象 form = NewsModelForm(request.POST) # 2. 校验 if form.is_valid(): # 3. 如果校验通过,保存数据 instance = form.save(commit=False) # commit=False 在本地保存,不连接数据库 # 添加作者字段 instance.author = request.user instance.save() # 连接数据库 return json_response(errmsg='添加新闻成功!') else: # 4. 如果校验失败,就返回包含错误信息的html return render(request, 'myadmin/news/news_detail.html', context={'form': form})
def post(self, request, news_id): # 是否登录 if not request.user.is_authenticated: return json_response(errno=Code.SESSIONERR, errmsg=error_map[Code.SESSIONERR]) # 新闻是否存在 if not News.objects.only('id').filter(is_delete=False, id=news_id).exists(): return json_response(errno=Code.PARAMERR, errmsg='新闻不存在!') # 获取前端数据 try: json_data = request.body if not json_data: return json_response(errno=Code.PARAMERR, errmsg="参数为空,请重新输入") dict_data = json.loads(json_data.decode('utf8')) except Exception as e: logger.info("错误信息,\n{}".format(e)) return json_response(errno=Code.UNKOWNERR, errmsg=error_map[Code.UNKOWNERR]) content = dict_data.get('content') # 内容是否为空 if not content: return json_response(errno=Code.PARAMERR, errmsg='评论内容不能为空!') # 父id是否正常 parent_id = dict_data.get('parent_id') if parent_id: try: # 判断是不是整数 parent_id = int(parent_id) # 判断是否有父评论,父评论id是否与新闻id匹配 if not Comments.objects.only('id').\ filter(is_delete=False, id=parent_id, news_id=news_id).exists(): return json_response(errno=Code.PARAMERR, errmsg=error_map[Code.PARAMERR]) except Exception as e: logger.info('前端传递过来的parent_id异常\n{}'.format(e)) return json_response(errno=Code.PARAMERR, errmsg='未知异常') # 保存到数据库 new_comment = Comments() new_comment.content = content new_comment.news_id = news_id new_comment.author = request.user new_comment.parent_id = parent_id if parent_id else None new_comment.save() return json_response(data=new_comment.to_dict())
def post(self, request): # 1.根据post的数据,创建表单对象 form = GroupModelForm(request.POST) # 2.校验 if form.is_valid(): form.save() return json_response(errmsg='添加分组成功!') else: menus = Menu.objects.only( 'name', 'permission_id').select_related('permission').filter( is_deleted=False, is_visible=True, parent=None) # 2.返回渲染表单 return render(request, 'myadmin/group/group_detail.html', context={ 'form': form, 'menus': menus })
def get(self, request): # 1. 获取参数 try: tag_id = int(request.GET.get('tag', 0)) # 默认值为0 except Exception as e: logger.error('标签错误: \n{}'.format(e)) tag_id = 0 try: page = int(request.GET.get('page', 1)) # 默认值为0 except Exception as e: logger.error('页码错误: \n{}'.format(e)) page = 1 # 2. 获取查询集 '''news_queryset = News.objects.values('id', 'title', 'digest', 'image_url', 'update_time', 'tag__name', 'author__username') 这种写法不方便,因为最终需要返回的字段名为 author而不是tag__name ''' news_queryset = News.objects.values( 'id', 'title', 'digest', 'image_url', 'update_time').annotate(tag_name=F('tag__name'), author=F('author__username')) # 过滤 # if tag_id: # news = news_queryset.filter(is_deleted=False, tag_id=tag_id) # else: # news = news_queryset.filter(is_deleted=False) news = news_queryset.filter( is_deleted=False, tag_id=tag_id) or news_queryset.filter(is_deleted=False) # 3. 分页 # 创建分页对象 paginator = Paginator(news, constants.PER_PAGE_NEWS_COUNT) # 获取当前页数据 current_page = paginator.get_page(page) # 4. 返回数据 data = { 'total_pages': paginator.num_pages, 'news': list(current_page), } return json_response(data=data)
def get(self, request): # banners = Banner.objects.values('image_url', 'news_id').annotate( # news_title=F('news__title') # ).filter(is_delete=False)[:constants.SHOW_BANNER_COUNT] banners = Banner.objects.select_related('news').\ only('image_url', 'news_id', 'news__title').\ filter(is_delete=False)[:constants.SHOW_BANNER_COUNT] # 序列化输出 banners_info_list = [] for b in banners: banners_info_list.append({ 'image_url': b.image_url, 'news_id': b.news_id, 'news_title': b.news.title }) # 返回前端 data = { 'banners': banners_info_list } return json_response(data=data)
def post(self, request): # 1.接收参数并验证 form = MenuModelForm(request.POST) if form.is_valid(): # 创建菜单 new_menu = form.save() # 菜单的权限对象,菜单的外键 content_type = ContentType.objects.filter(app_label='myadmin', model='menu').first() new_permission = Permission.objects.create( name=new_menu.name, content_type=content_type, codename=new_menu.codename) new_menu.permission = new_permission new_menu.save(update_fields=['permission']) # 添加update参数可以提高性能 return json_response(errmsg='添加菜单成功') else: return render(request, 'myadmin/menu/add_menu.html', context={'form': form})
def get(self, request, group_id): # 1. 拿到要修改的分组 group = Group.objects.filter(id=group_id).first() # 1.1 判断是否存在 if not group: return json_response(errno=Code.NODATA, errmsg='没有此分组!') # 2. 创建表单 form = GroupModelForm(instance=group) # 3. 拿到所有可用一级菜单 menus = Menu.objects.only( 'name', 'permission_id').select_related('permission').filter( is_deleted=False, is_visible=True, parent=None) # 4. 拿到当前组的可用权限 permissions = group.permissions.only('id').all() # 5. 返回渲染html return render(request, 'myadmin/group/group_detail.html', context={ 'form': form, 'menus': menus, 'permissions': permissions })
def post(self, request, news_id): # 是否登录 if not request.user.is_authenticated: return json_response(errno=Code.SESSIONERR, errmsg=error_map[Code.SESSIONERR]) # 新闻是否存在 if not News.objects.filter(is_deleted=False, id=news_id).exists(): return json_response(errno=Code.PARAMERR, errmsg='新闻新闻不存在') # 判断内容 content = request.POST.get('content') if not content: return json_response(errno=Code.PARAMERR, errmsg='评论内容不能为空') # 父id 是否正常 parent_id = request.POST.get('parent_id') if parent_id: try: parent_id = int(parent_id) if not Comments.objects.filter(is_deleted=False, id=parent_id, news_id=news_id).exists(): return json_response(errno=Code, errmsg=error_map[Code.PARAMERR]) except Exception as e: logger.info('前端传递过来的parent_id异常\n{}'.format(e)) return json_response(errn=Code.PARAMERR, errmsg='未知异常') # 保存到数据库 new_comment = Comments() new_comment.content = content new_comment.news_id = news_id new_comment.author = request.user new_comment.parent_id = parent_id if parent_id else None new_comment.save() # 序列化可放到模型中 return json_response(data=new_comment.to_dict_data())
def post(self, request): ''' 1. 校验手机号码 2. 校验图形验证码 3. 重新发送验证码时间间隔 4. 保存短信验证码 5. 保存发送记录 :param request: :return: ''' # 1.校验手机号 # mobile = request.POST.get('mobile') # 需要先重载form的构造方法 , forms.py form = CheckImageForm(request.POST, request=request) if form.is_valid(): # 获取手机号码 mobile = form.cleaned_data.get('mobile') # 生成短信验证码 sms_code = ''.join([ random.choice('0123456789') for _ in range(constants.SMS_CODE_LENGTH) ]) # 发送短信验证码 调用接口 logger.info('发送短信验证码正常[mobile: %s sms_code: %s' % (mobile, sms_code)) # ccp = CCP() # try: # res = ccp.send_template_sms(mobile, [sms_code, constants.SMS_CODE_EXPIRES], "1") # if res == 0: # logger.info('发送短信验证码[正常][mobile: %s sms_code: %s]' % (mobile, sms_code)) # else: # logger.error('发送短信验证码[失败][mobile: %s sms_code: %s]' % (mobile, sms_code)) # return json_response(error=Code.SMSFAIL, errmsg=error_map[Code.SMSFAIL]) # except Exception as e: # logger.error(('发送短信验证码[异常][mobile: %s message: %s]' % (mobile, e))) # return json_response(errno=Code.SMSERROR, errmsg=error_map[Code.SMSERROR]) # 保存发送记录, 不存在session中因为时限不一致(session中所有key值的时限是统一的),应存到redis中 # 创建短信验证码发送记录的key sms_flag_key = 'sms_flag_{}'.format(mobile) # 创建短信验证码内容的key sms_text_key = 'sms_text_{}'.format(mobile) # 创建连接 redis_conn = get_redis_connection(alias='verify_code') # 创建管道 pl = redis_conn.pipeline() try: pl.setex(sms_flag_key, constants.SMS_CODE_INTERVAL, 1) # 第一个参数:key名,第二个参数:过期时间,第三个参数:对应值 pl.setex(sms_text_key, constants.SMS_CODE_EXPIRES * 60, sms_code) # 让管道通知redis执行命令 pl.execute() return json_response(errmsg='短信发送成功!') except Exception as e: logger.error('redis 执行异常:{}'.format(e)) return json_response(errno=Code.UNKOWNERR, errmsg=error_map[Code.UNKOWNERR]) else: # 将表单的报错信息进行拼接 error_msg_list = [] for item in form.errors.values(): error_msg_list.append(item[0]) error_msg_str = '/'.join(error_msg_list) return json_response(errno=Code.PARAMERR, errmsg=error_msg_str)