Django blog项目《十六》:后台admin《文章标签功能实现》

这篇博客详细介绍了如何在Django项目中实现文章标签的功能,包括展示、编辑、删除和添加。通过分析业务流程、请求方式和前端后端处理,展示了在urls.py和views.py中的具体操作,以及前端js的逻辑处理。
摘要由CSDN通过智能技术生成

后台站点中很多功能就是增删改查这四个功能上的延伸。

今天实现文章功能标签功能的实现。

一、文章标签功能分析

1. 业务流程

  1. 文章标签展示功能
    • 从数据库中获取到数据填充到前端
  2. 文章标签编辑功能
    • 前端传递一个携带文章标签id的put请求到后端
    • 后端获取到参数
    • 从数据库中获取到该id标签对象,有则改,无则报错
    • 返回数据到前端
  3. 文章标签删除功能
    • 前端传递一个携带文章标签id路径参数的delete请求到后端
    • 从数据库中获取到该id标签对象,有则留逻辑删除,无则报错
    • 返回数据到前端
  4. 文章标签添加功能
    • 前端传递一个携带文章标签name参数的post请求到后端
    • 后端获取到参数
    • 判断数据库中是否有改标签名,无则增,有则报错
    • 返回数据到前端

2. 请求方式、地址、参数

  1. 文章标签展示功能

    1. 请求方式:GET

    2. 请求地址:/admin/tags/

    3. 请求参数:无

  2. 文章标签编辑功能

    1. 请求方式:PUT

    2. 请求地址:/admin/tags/<int:tag_id>/

    3. 请求参数:

      参数名 类型 是否必传 备注
      tag_id int 必传 路径参数
  3. 文章标签删除功能

    1. 请求方式:DELETE

    2. 请求地址:/admin/tags/<int:tag_id>/

    3. 请求参数:

      参数名 类型 是否必传 备注
      tag_id int 必传 路径参数
  4. 文章标签添加功能

    1. 请求方式:POST

    2. 请求地址:/admin/tags/

    3. 请求参数:

      参数名 类型 是否必传 备注
      name str 必传 请求体

3. 前端处理

  1. 文章标签展示功能

    • 将后端传来的数据进行填充到数据库中
  2. 文章标签编辑功能

    • 获取到点击编辑按钮的元素

    • 获取到该文章标签的id

    • 发送ajax请求到后端

      • 成功后动态更改标签的名字
  3. 文章标签删除功能

    1. 获取到点击删除按钮的元素

    2. 获取到该文章标签的id

    3. 发送ajax delete请求到后端

      • 成功后删除掉该条标签
  4. 文章标签添加功能

    1. 获取到点击添加按钮的元素
    2. 获取到添加的文章标签name
    3. 发送ajax post请求到后端
      • 成功后动态添加文章标签

4. 后端处理

  1. 文章标签展示功能

    • 从数据库中获取到标签的数据传递给前端
  2. 文章标签编辑功能

    • 从数据库中获取到该id的文章标签数据

    • 判断是否存在,并判断新的name是否和原来的一样

    • 返回数据给前端

  3. 文章标签删除功能

    1. 从数据库中获取到该id的文章标签数据

    2. 判断是否存在,有则删

    3. 返回数据给前端

  4. 文章标签添加功能

    1. 从前端获取到数据
    2. 获取到添加的文章标签name
    3. 判断该name是否在文章标签表中是否存在,无则增
    4. 返回数据到前端

二、具体实现

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 () {
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值