elementplus django drf 如何做到确认单据禁止删除
要在Django和Django Rest Framework(DRF)中实现禁止删除确认单据的功能,你可以通过以下步骤来完成:
- 创建模型:首先,你需要在Django中创建一个模型来表示确认单据。这个模型应该包含与确认单据相关的所有信息,例如日期、状态等。确保你的模型有一个字段来标识确认单据是否可以被删除,例如一个布尔字段
is_deletable
。
from django.db import models class ConfirmationDocument(models.Model):
date = models.DateField()
status = models.CharField(max_length=50)
is_deletable = models.BooleanField(default=True) # 其他字段和方法
- 创建序列化器:使用DRF创建一个序列化器来将确认单据序列化为JSON格式。确保在序列化器中包含
is_deletable
字段。
from rest_framework import serializers class ConfirmationDocumentSerializer(serializers.ModelSerializer):
class Meta:
model = ConfirmationDocument
fields = '__all__'
- 创建视图:创建一个DRF视图来处理确认单据的操作,包括查看、创建、更新和删除。在删除操作中,你需要检查
is_deletable
字段的值,如果为True
,则允许删除,否则禁止删除。
from rest_framework import generics
from rest_framework import status
from rest_framework.response import Response class ConfirmationDocumentListCreateView(generics.ListCreateAPIView):
queryset = ConfirmationDocument.objects.all()
serializer_class = ConfirmationDocumentSerializer class ConfirmationDocumentRetrieveUpdateDeleteView(generics.RetrieveUpdateDestroyAPIView):
queryset = ConfirmationDocument.objects.all()
serializer_class = ConfirmationDocumentSerializer def perform_destroy(self, instance):
if instance.is_deletable:
instance.delete()
else:
return Response({'message': 'This confirmation document cannot be deleted.'}, status=status.HTTP_403_FORBIDDEN)
- 配置URL路由:配置Django的URL路由以便与视图关联。
from django.urls import path
from . import views urlpatterns = [
path('confirmation-documents/', views.ConfirmationDocumentListCreateView.as_view(), name='confirmation-document-list'),
path('confirmation-documents/<int:pk>/', views.ConfirmationDocumentRetrieveUpdateDeleteView.as_view(), name='confirmation-document-detail'),
]
现在,你已经配置好了Django和DRF,以确保只有 is_deletable
字段为 True
的确认单据可以被删除。对于不可删除的确认单据,将返回一个HTTP 403禁止访问的响应。你可以根据你的需求进一步自定义消息和响应。
viewsets.ModelViewSet
,你可以覆盖destroy
方法来实现确认单据是否可删除的逻辑。以下是一个示例:from rest_framework import viewsets, status
from rest_framework.response import Response class ConfirmationDocumentViewSet(viewsets.ModelViewSet):
queryset = ConfirmationDocument.objects.all()
serializer_class = ConfirmationDocumentSerializer def destroy(self, request, *args, **kwargs):
instance = self.get_object() if instance.is_deletable:
self.perform_destroy(instance)
return Response(status=status.HTTP_204_NO_CONTENT)
else:
return Response({'message': 'This confirmation document cannot be deleted.'}, status=status.HTTP_403_FORBIDDEN)
这段代码覆盖了destroy
方法,在删除确认单据之前检查了is_deletable
字段的值。如果is_deletable
为True
,则允许删除,否则返回一个HTTP 403禁止访问的响应。
确保在你的URL路由中配置了ConfirmationDocumentViewSet
,以便它可以处理相应的API请求。
你可以创建一个通用的 mixin 类(混合类),将这个逻辑封装在 mixin 中,然后让你的视图集成这个 mixin,以便多个视图共享相同的逻辑。这将帮助你避免重复编写相同的操作。以下是一个示例:
首先,创建一个 mixin 类,包含确认单据是否可删除的逻辑:
from rest_framework import status
from rest_framework.response import Response class DeletableViewMixin:
def destroy(self, request, *args, **kwargs):
instance = self.get_object() if instance.is_deletable:
self.perform_destroy(instance)
return Response(status=status.HTTP_204_NO_CONTENT)
else:
return Response({'message': 'This item cannot be deleted.'}, status=status.HTTP_403_FORBIDDEN)
然后,你可以在你的视图集成这个 mixin,以便多个视图共享相同的删除逻辑:
from rest_framework import viewsets class ConfirmationDocumentViewSet(DeletableViewMixin, viewsets.ModelViewSet):
queryset = ConfirmationDocument.objects.all()
serializer_class = ConfirmationDocumentSerializer
通过这种方式,ConfirmationDocumentViewSet
现在包含了 DeletableViewMixin
中定义的删除逻辑,你可以将这个 mixin 用于其他需要相同逻辑的视图中。这样可以提高代码的可维护性和可重用性。
要使用 Element Plus(基于 Vue.js 的 UI 组件库)在前端实现确认单据的禁止删除功能,你可以按照以下步骤进行操作:
- 安装 Element Plus:首先,确保你的项目中已经安装了 Vue.js 和 Element Plus。你可以通过 npm 或 yarn 来安装 Element Plus。
npm install element-plus
- 导入 Element Plus 组件:在你的 Vue.js 项目中,导入 Element Plus 的相关组件。
import { Button, Table, TableColumn, MessageBox, Message } from 'element-plus'; // 注册 Element Plus 组件
app.component(Button.name, Button);
app.component(Table.name, Table);
app.component(TableColumn.name, TableColumn);
确保在你的 Vue 实例中注册了这些组件。
- 创建确认单据列表:在你的组件中,使用 Element Plus 组件来创建确认单据的列表。你可以使用
el-table
和el-button
来创建表格和按钮。
<template>
<div>
<el-button @click="deleteConfirmationDocument" type="danger">删除确认单据</el-button>
<el-table :data="confirmationDocuments" style="width: 100%">
<el-table-column prop="id" label="ID"></el-table-column>
<el-table-column prop="date" label="日期"></el-table-column>
<el-table-column prop="status" label="状态"></el-table-column>
</el-table>
</div>
</template>
- 处理删除操作:在你的组件中,创建一个方法来处理删除操作。当用户点击删除按钮时,你可以弹出一个确认对话框,然后根据确认单据是否可删除来执行删除操作。
<script>
export default {
data() {
return {
confirmationDocuments: [], // 确认单据列表
};
},
methods: {
deleteConfirmationDocument() {
const selectedConfirmationDocument = this.getSelectedConfirmationDocument(); if (!selectedConfirmationDocument) {
Message.warning('请选择要删除的确认单据');
return;
} if (!selectedConfirmationDocument.is_deletable) {
Message.error('此确认单据不能被删除');
return;
} MessageBox.confirm('确定要删除此确认单据吗?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
// 执行删除操作
this.confirmationDocuments.splice(this.confirmationDocuments.indexOf(selectedConfirmationDocument), 1);
Message.success('确认单据删除成功');
});
},
getSelectedConfirmationDocument() {
// 在你的数据中获取选中的确认单据
// 你可以根据表格的选择状态来获取选中的数据
// 这里的示例代码仅供参考,具体实现根据你的项目结构而定
},
},
};
</script>
上述代码中,我们创建了一个 deleteConfirmationDocument
方法来处理删除操作。在此方法中,我们首先检查用户是否选择了要删除的确认单据,然后再检查确认单据是否可删除。如果确认单据可以删除,将弹出一个确认对话框,用户确认后执行删除操作。
请注意,上述示例中的数据和方法都是简化的示例,你需要根据你的项目实际情况进行调整。此外,确保你的 Vue.js 组件与 Element Plus 组件正确集成,并且已经设置了确认单据列表和删除逻辑。
getSelectedConfirmationDocument
是一个自定义的方法,用于获取用户在界面上选中的确认单据对象。在前端界面中,通常需要一种方法来检测用户在表格或列表中选择了哪些项目,然后执行相应的操作。
具体实现方法取决于你的界面和数据结构。以下是一种可能的实现方式:
getSelectedConfirmationDocument() {
// 假设你有一个名为 selectedConfirmationDocument 的数据属性来跟踪选中的确认单据
return this.selectedConfirmationDocument;
},
在这种实现中,我们假设你的组件有一个名为 selectedConfirmationDocument
的数据属性,该属性用来存储用户选中的确认单据对象。当用户在界面上选择一个确认单据时,你可以将其赋值给这个属性。
例如,在表格中,你可以使用 Element Plus 的 @row-click
事件来监听行的点击事件,并在事件处理程序中更新 selectedConfirmationDocument
。以下是一个示例:
<el-table :data="confirmationDocuments" @row-click="handleRowClick">
<!-- 表格列的定义 -->
</el-table>
data() {
return {
confirmationDocuments: [],
selectedConfirmationDocument: null, // 用来存储选中的确认单据
};
},
methods: {
handleRowClick(row) {
this.selectedConfirmationDocument = row;
},
// 其他方法
},
在这个示例中,我们使用了 @row-click
事件来监听行的点击事件,并在 handleRowClick
方法中更新了 selectedConfirmationDocument
,以便我们后续可以在 deleteConfirmationDocument
方法中使用它来获取选中的确认单据。
请根据你的项目的实际情况和界面交互方式来调整 getSelectedConfirmationDocument
方法的实现。
如果你的界面允许多选确认单据,并且你想要确保不能删除其中某些选中的确认单据,可以通过以下方式进行处理:
- 修改确认单据模型:首先,确保你的确认单据模型中有一个字段,用来表示确认单据是否可以删除。例如,你可以添加一个名为
is_deletable
的布尔字段。
class ConfirmationDocument(models.Model):
# 其他字段
is_deletable = models.BooleanField(default=True)
- 在前端界面中处理多选:在前端界面中,确保用户可以选择多个确认单据。可以使用 Element Plus 的多选表格(
<el-table>
)来实现这一点。你需要添加一个复选框列,并在组件中维护一个选中的确认单据列表。
<el-table :data="confirmationDocuments" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55"></el-table-column>
<!-- 其他列的定义 -->
</el-table>
在 handleSelectionChange
方法中,你可以获取当前选中的确认单据列表:
data() {
return {
confirmationDocuments: [],
selectedConfirmationDocuments: [], // 存储选中的确认单据
};
},
methods: {
handleSelectionChange(selection) {
this.selectedConfirmationDocuments = selection;
},
// 其他方法
},
- 处理删除操作:在你的删除操作中,需要遍历选中的确认单据列表,检查每个确认单据的
is_deletable
属性,以确定是否可以删除。
deleteConfirmationDocuments() {
if (this.selectedConfirmationDocuments.length === 0) {
Message.warning('请选择要删除的确认单据');
return;
} const nonDeletableDocuments = this.selectedConfirmationDocuments.filter(document => !document.is_deletable); if (nonDeletableDocuments.length > 0) {
const nonDeletableDocumentNames = nonDeletableDocuments.map(document => document.name).join(', ');
Message.error(`以下确认单据不能被删除:${nonDeletableDocumentNames}`);
return;
} MessageBox.confirm('确定要删除选中的确认单据吗?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
// 执行删除操作
this.selectedConfirmationDocuments.forEach(document => {
// 从界面和数据源中删除确认单据
const index = this.confirmationDocuments.indexOf(document);
if (index !== -1) {
this.confirmationDocuments.splice(index, 1);
}
});
Message.success('确认单据删除成功');
});
},
上述代码中,我们首先检查用户是否选择了要删除的确认单据,然后遍历选中的确认单据列表,检查每个确认单据的 is_deletable
属性。如果有不可删除的确认单据,将显示错误消息,否则将执行删除操作。
请根据你的项目的实际情况和界面交互方式来调整处理多选删除操作的代码。
如果你有一个共用的删除方法 doDelete()
,但不是所有的模块都具有确认功能,你可以考虑在调用 doDelete()
方法时传递一个额外的参数,用来表示是否需要进行确认操作。这可以通过一个布尔值参数来实现。以下是一个示例:
首先,在你的 doDelete()
方法中添加一个参数 needsConfirmation
,用于表示是否需要进行确认操作:
function doDelete(item, needsConfirmation = false) {
if (needsConfirmation) {
// 显示确认对话框并在用户确认后执行删除操作
showConfirmationDialog(() => {
// 执行删除操作
deleteItem(item);
});
} else {
// 不需要确认操作,直接执行删除操作
deleteItem(item);
}
} function deleteItem(item) {
// 执行删除操作的实际逻辑
// ...
} function showConfirmationDialog(onConfirm) {
// 显示确认对话框的逻辑
// ...
}
在上述代码中,我们将 doDelete()
方法修改为接受一个额外的 needsConfirmation
参数,默认为 false
。如果 needsConfirmation
为 true
,则会显示确认对话框并在用户确认后执行删除操作。如果 needsConfirmation
为 false
,则直接执行删除操作。
在调用 doDelete()
方法时,根据模块是否具有确认功能,传递相应的参数值。例如:
// 调用需要确认的删除操作
doDelete(itemWithConfirmation, true); // 调用不需要确认的删除操作
doDelete(itemWithoutConfirmation, false);
通过这种方式,你可以在不同的模块中根据需要控制是否进行确认操作,而无需在 doDelete()
方法内部硬编码确认逻辑。这样可以更灵活地处理不同模块的需求。
根据你的要求,你可以在点击删除按钮时,首先判断是否有选中的行,然后再判断选中的行中是否有的行中的确认字段是否为 true
。如果是 true
,则禁止删除并显示提示信息,否则执行删除操作。以下是相应的 Element Plus 代码示例:
<template>
<div>
<el-button @click="handleDelete" type="danger">删除</el-button>
<el-table :data="confirmationDocuments" @row-click="handleRowClick" ref="table">
<el-table-column type="selection"></el-table-column>
<el-table-column prop="id" label="ID"></el-table-column>
<el-table-column prop="date" label="日期"></el-table-column>
<el-table-column prop="status" label="状态"></el-table-column>
</el-table>
</div>
</template> <script>
export default {
data() {
return {
confirmationDocuments: [
{ id: 1, date: '2023-09-19', status: '已确认' },
{ id: 2, date: '2023-09-20', status: '未确认' },
{ id: 3, date: '2023-09-21', status: '已确认' },
],
selectedRows: [], // 存储选中的行数据
};
},
methods: {
handleRowClick(selection) {
this.selectedRows = selection;
},
handleDelete() {
if (this.selectedRows.length === 0) {
this.$message.warning('请选择要删除的确认单据');
return;
} const hasUnconfirmed = this.selectedRows.some(row => row.status === '未确认'); if (hasUnconfirmed) {
this.$message.error('选中的确认单据中包含未确认的单据,无法删除');
} else {
// 执行删除操作
this.confirmationDocuments = this.confirmationDocuments.filter(
document => !this.selectedRows.includes(document)
);
this.selectedRows = [];
this.$message.success('确认单据删除成功');
this.$refs.table.clearSelection(); // 清除表格中的选中状态
}
},
},
};
</script>
在上述代码中,我们使用 selectedRows
来存储选中的行数据。在点击删除按钮时,首先检查是否有选中的行,然后使用 some
方法来检查是否有未确认的行。如果有未确认的行,则显示错误消息,否则执行删除操作。
请根据你的项目的实际数据和逻辑来调整代码中的数据和条件。这个示例假设状态为 "已确认" 的行可以被删除,而状态为 "未确认" 的行不能被删除。
如果你想要同时判断选中的行中是否有确认的行和已经核准的行,你可以在 some
方法中添加一个额外的条件。下面是示例代码:
const hasUnconfirmed = this.selections.some(row => row.confirm === true);
const hasApproved = this.selections.some(row => row.approved === true); if (hasUnconfirmed) {
// 选中的行中包含确认的行
// 处理逻辑
} if (hasApproved) {
// 选中的行中包含已核准的行
// 处理逻辑
}
在这段代码中,首先使用 some
方法来检查 row.confirm
属性是否为 true
,以判断选中的行中是否有确认的行。然后,再使用另一个 some
方法来检查 row.approved
属性是否为 true
,以判断选中的行中是否有已核准的行。
你可以根据实际需求,根据 hasUnconfirmed
和 hasApproved
的值来执行相应的逻辑操作。这样可以同时处理两种情况,无需重复遍历选中的行。
const hasUnconfirmedOrApproved = this.selections.some(row => row.confirm === true || row.approved === true); if (hasUnconfirmedOrApproved) {
// 选中的行中包含确认的行或已核准的行
// 处理逻辑
}
是的,你可以将这两个条件合并成一个条件,以便更简洁地判断选中的行中是否有确认的行和已核准的行。你可以使用逻辑运算符 ||
(或)来实现这一点,如下所示:
hasUnconfirmedOrApproved
将为 true
,如果选中的行中至少有一行的 row.confirm
属性为 true
或 row.approved
属性为 true
。这样,你只需要检查一个条件就可以同时处理两种情况。elementplus django drf 如何做到确认单据禁止删除的更多相关文章
- 解决Django + DRF:403 FORBIDDEN:CSRF令牌丢失或不正确,{"detail":"CSRF Failed: CSRF cookie not set."}
我有一个Android客户端应用程序尝试使用Django + DRF后端进行身份验证.但是,当我尝试登录时,我收到以下响应: 403: CSRF Failed: CSRF token missing ...
- django DRF理解
django restframework(DRF) 最近的开发过程当中,发现restframework的功能很强大,所以尝试解读了一下源码,写篇博客分享给大家,有错误的地方还请各位多多指出 视图部分 ...
- Django DRF 分页
Django DRF 分页 分页在DRF当中可以一共有三种,可以通过setttings设置,也可也通过自定义设置 PageNumberPagination 使用URL http://127.0.0.1 ...
- SAP中主数据和单据的删除
在SAP实际操作的过程中,有些主数据或者单据需要删除,但是删除的方法却不尽相同,所以笔者今天总结了下,供大家参考. 1,用T-Code去删除 例如我们要删除某个物料,我们可以用T-Code MM06 ...
- mssql sqlserver 禁止删除数据表中指定行数据(转自:http://www.maomao365.com/?p=5323)
转自:http://www.maomao365.com/?p=5323 摘要:下文主要讲述,如何禁止删除数据表中指定行数据 最近收到用户一个需求,禁止所有人删除”表A”中,ID 为1.2.3.4.5的 ...
- input 禁止删除部分文字
用label和所需的input链接,label部分就是禁止删除的部分.<input type="text" name="city" value=" ...
- Django -- DRF 认证流程
Django Restful Framework (DRF)中类的调用与自定义-- 以 autentication 认证为例 DRF 的 request 对 django 的 request 进行了更 ...
- Django drf:cbv源码、resful规范及接口、drf使用、response源码、序列化
一.cbv源码分析 二.resful规范 三.django中写resful的借口 四.drf写resful的借口 五.APIVIew源码分析 六.drf之序列化 一.cbv源码分析 -CBV和FBV ...
- django drf 基础学习3
一 简述 这里来谈下一些基本原理 二 汇总 1 restful规范 1 根据method不同做不同的操作 request.method=' get(获取) 返回完整 ...
- django drf 基础学习2
DRF基本程序调用一 models初步编写 1 编写model.py from django.db import models 导入 class dbinfo(models.Model) ...
随机推荐
- avue-crud字段之间的动态交互效果以及接口数据的获取赋值
一.form表单下拉表单类型字段数据获取 1.通过配置系统字典接口获取数据并渲染 { label: "经纪人", prop: "broker", type: & ...
- Biwen.Settings添加对IConfiguration&IOptions的集成支持
Biwen.Settings 是一个简易的配置项管理模块,主要的作用就是可以校验并持久化配置项,比如将自己的配置存储到数据库中,JSON文件中等 使用上也是很简单,只需要在服务中注入配置即可, 比如我 ...
- 使用 OWIN Self-Host ASP.NET Web API 自宿主 Swagger Swashbuckle 在线文档
使用 OWIN Self-Host ASP.NET Web APIhttps://learn.microsoft.com/zh-cn/aspnet/web-api/overview/hosting-a ...
- github加速与添加ssh密钥
part1-github加速 此处推荐Fetch GitHub Hosts,文章的中间位置有手动添加dns的内容,十分完备,此处不赘述.不知道是不是我家网络抽风,总是得代理才能进githubQAQ难受 ...
- k8s集群创建阿里云版本
阿里云创建k8s集群实例 创建两个8G内存的抢占实例(青岛),能ssh 默认关闭防火墙,且没有交换分区 配置/etc/hosts,主机名 配置k8s仓库 配置命令补全 安装docker(需要conta ...
- docker——存储配置与管理
docker存储配置与管理 查看docker info [root@hmm overlay2]# docker info Client: Docker Engine - Community Versi ...
- [SWPUCTF 2021 新生赛]easyrce
这道题比较简单,打开环境一看就只需要构造一个get传参的命令就行,我们就看一下有些什么文件,构造payload: ?url=system ("ls /"); 看到有个 flllll ...
- asp.net上传Excel文件并读取内容,自定义上传控件样式
一.页面增加上传控件,并在上传时判断是否是Excel文件(根据后缀名判断): 1 <table> 2 <tr> 3 <td> 4 <span style=&q ...
- golang 泛型的格式写法
Go语言中的泛型(Generics)是在 Go 1.18 版本中引入的一个重要特性,它允许你编写可重用的代码,而不需要为每种数据类型重复编写相同的逻辑. 泛型通过参数化类型(type paramete ...
- 模拟epoll的饥饿场景
说明 一直听说epoll的饥饿场景,但是从未在实际环境中面对过,那么能不能模拟出来呢?实际的情况是怎样呢? 模拟步骤 基于epoll写一个简单的tcp echo server,将每次read返回的字节 ...