后台站点中很多功能就是增删改查这四个功能上的延伸。
今天实现文章功能标签功能的实现。
一、文章标签功能分析
1. 业务流程
- 文章标签展示功能
- 从数据库中获取到数据填充到前端
- 文章标签编辑功能
- 前端传递一个携带文章标签id的put请求到后端
- 后端获取到参数
- 从数据库中获取到该id标签对象,有则改,无则报错
- 返回数据到前端
- 文章标签删除功能
- 前端传递一个携带文章标签id路径参数的delete请求到后端
- 从数据库中获取到该id标签对象,有则留逻辑删除,无则报错
- 返回数据到前端
- 文章标签添加功能
- 前端传递一个携带文章标签name参数的post请求到后端
- 后端获取到参数
- 判断数据库中是否有改标签名,无则增,有则报错
- 返回数据到前端
2. 请求方式、地址、参数
-
文章标签展示功能
-
请求方式:GET
-
请求地址:/admin/tags/
-
请求参数:无
-
-
文章标签编辑功能
-
请求方式:PUT
-
请求地址:/admin/tags/<int:tag_id>/
-
请求参数:
参数名 类型 是否必传 备注 tag_id int 必传 路径参数
-
-
文章标签删除功能
-
请求方式:DELETE
-
请求地址:/admin/tags/<int:tag_id>/
-
请求参数:
参数名 类型 是否必传 备注 tag_id int 必传 路径参数
-
-
文章标签添加功能
-
请求方式:POST
-
请求地址:/admin/tags/
-
请求参数:
参数名 类型 是否必传 备注 name str 必传 请求体
-
3. 前端处理
-
文章标签展示功能
- 将后端传来的数据进行填充到数据库中
-
文章标签编辑功能
-
获取到点击编辑按钮的元素
-
获取到该文章标签的id
-
发送ajax请求到后端
- 成功后动态更改标签的名字
-
-
文章标签删除功能
-
获取到点击删除按钮的元素
-
获取到该文章标签的id
-
发送ajax delete请求到后端
- 成功后删除掉该条标签
-
-
文章标签添加功能
- 获取到点击添加按钮的元素
- 获取到添加的文章标签name
- 发送ajax post请求到后端
- 成功后动态添加文章标签
4. 后端处理
-
文章标签展示功能
- 从数据库中获取到标签的数据传递给前端
-
文章标签编辑功能
-
文章标签删除功能
-
从数据库中获取到该id的文章标签数据
-
判断是否存在,有则删
-
返回数据给前端
-
-
文章标签添加功能
- 从前端获取到数据
- 获取到添加的文章标签name
- 判断该name是否在文章标签表中是否存在,无则增
- 返回数据到前端
二、具体实现
1. 文章标签展示功能
1. urls.py配置
from django.urls import path
from admin import views
app_name = "admin"
urlpatterns = [
path("tags/", views.ArticleTagsView.as_view(), name="tags"),
]
2. views.py视图逻辑处理
from django.views import View
from django.db.models import Count
from django.shortcuts import render
from django.contrib.auth.mixins import PermissionRequiredMixin
from news import models
class ArticleTagsView(PermissionRequiredMixin, View): # 使用PermissionRequiredMixin做权限验证
"""
article tags show and add function View
route:/admin/tags/
permissions:view_tags
"""
# 设定有哪些权限的可以访问 文章标签查看和添加权限的。在数据库中可以看到view_tags和add_tags
permission_required = ('news.view_tags',)
raise_exception = True
# LOGIN_URL = "users:login" 可以直接在settings中指定,这样整个项目中访问都需要登录
# 查
def get(self, request):
tags = models.Tags.objects.values("id", "name").annotate(
article_counts=Count(
"articles")).filter(is_delete=False).order_by("-article_counts",
"-update_time")
return render(request, "admin/news/tags.html", locals())
2. 文章标签编辑功能
1. urls.py配置
from django.urls import path
from admin import views
app_name = "admin"
urlpatterns = [
path("tags/<int:tag_id>/", views.ArticleTagsManageView.as_view(), name="tags_manage"),
]
2. views.py视图逻辑处理
import json
from django.views import View
from django.contrib.auth.mixins import PermissionRequiredMixin
from news import models
from utils.res_code.res_code import Code, error_map
from utils.res_code.json_function import to_json_data
class ArticleTagsManageView(PermissionRequiredMixin, View):
"""
article tags edit and delete function View
route:/admin/tags/<int:tag_id>/
permissions:change_tags
"""
# 设定有哪些权限的可以访问 文章标签查看和添加权限的。在数据库中可以看到view_tags和add_tags
permission_required = ('news.change_tags', )
raise_exception = True # 后台没有权限就报错403
# 改
def put(self, request, tag_id):
# 1. 获取参数
try:
json_data = request.body
if not json_data:
return to_json_data(errno=Code.PARAMERR, errmsg=error_map[Code.PARAMERR])
dict_data = json.loads(json_data.decode("utf-8"))
except Exception as e:
return to_json_data(errno=Code.UNKOWNERR, errmsg=error_map[Code.UNKOWNERR])
new_tag_name = dict_data.get("name")
# 2. 从数据库中获取到id=tag_id的tag_name
tag_obj = models.Tags.objects.only("name").filter(id=tag_id).first()
# 3. 判断old_tag_name:是否存在、是否和new_tag_name相同
if tag_obj:
old_tag_name = tag_obj.name # 获取到数据库中的标签名
if new_tag_name and new_tag_name.strip(): # 新标签名不为空和去掉空格后不为空
if old_tag_name != new_tag_name: # 新标签名和旧标签名不能一样
tag_obj.name = new_tag_name
tag_obj.save(update_fields=["name"]) # 只更新标签名字段
return to_json_data(errmsg="更新成功")
else:
return to_json_data(errmsg="标签名未修改")
else:
return to_json_data(errmsg="文章标签名为空")
3. js前端逻辑处理
$(function () {