表格上传
目录
1.完成上次还遗留下来的修改和删除功能
2.资产表格文件上传功能
3.代码展示集合
这篇文章, 先把上一篇文章剩下的修改和删除功能解决了, 因为绩效表格的修改和删除功能, 和之前的修改删除有一点区别, 不过原理都是一样的, 然后再实现把资产表格文件功能。
一、完成上次还遗留下来的修改和删除功能
绩效修改功能代码:
perform.py:
class PerformModifyModelForm(forms.ModelForm):
class Meta:
model = models.Perform
fields = ["oid", "source", "title", "price"]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for name, field in self.fields.items():
field.widget.attrs = {"class": "form-control"}
def modify_perform(request, nid):
title = "修改绩效信息"
query_set = models.Perform.objects.filter(id=nid).first()
if request.method == "GET":
form = PerformModifyModelForm(instance=query_set)
content = {"form": form, "title": title}
return render(request, "perform/perform_add_modify.html", content)
form = PerformModifyModelForm(data=request.POST, files=request.FILES, instance=query_set)
if form.is_valid():
form.save()
return redirect("/perform/list/")
return render(request, "perform/perform_add_modify.html", {"form": form, "title": title})
这里面需要注意的是, 我们只需要修改oid, source, title, price这四个字段的信息, 其他比如name和image是不能修该的, 因为name就是当前添加信息的那个人的账号名, image是上传的文件, 一般文件上传错了, 得重新上传再修改即可, 无需重新修改文件, 否则修改之后新的文件和之前未修改遗留下来的文件都在, 这样的话就浪费空间了。
绩效删除功能的代码:
perform.py:
def delete_file(request, nid):
# 如果当前这张图片只会出现一次,文件+数据表内容一起删除
# 如果文件出现多次
path_obj = models.Perform.objects.filter(id=nid).first()
# 获取当前文件路径
filepath = path_obj.image
# 删除数据
path_obj.delete()
try:
# 将文件进行删除(删除数据表格的同时, 也要把项目里面的media对应的文件一并删除)。
os.remove(filepath)
except:
return redirect("/perform/list/")
return redirect("/perform/list/")
这里删除和之前写过删除的代码, 有些区别, 因为当我们删除数据的时候, 所对应上传的文件也要一并删除, 那这边代码的操作就会比以前多些, 但是删除的原理还是差不多。
添加路由:
urls.py:
"""project_simple URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/4.1/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, re_path
from django.views.static import serve
from django.conf import settings
from project_one.views import depart, user, assets, admin_role, login, Ajax_data, task_data, perform
urlpatterns = [
path('asset/file/', assets.asset_file, name="asset_file"),
path("perform/<int:nid>/modify/", perform.modify_perform, name="modify_perform"),
path("perform/<int:nid>/delete/", perform.delete_file, name="delete_file")
]
在前端的修改删除那两个地方加上路由:
perform_list.html:
<a href="/perform/{{ data.id }}/modify"><span style="color: green;" class="glyphicon glyphicon-pencil" aria-hidden="true"></span></a>
<a href="/perform/{{ data.id }}/delete"><span style="color: red;" class="glyphicon glyphicon-trash" aria-hidden="true"></span></a>
修改页面的话, 还是会用到perform_add_modify.html。
perform_add_modify.html代码:
{% extends "index/model_tmp.html" %}
{% load static %}
{% block css %}
<link rel="stylesheet" href="{% static 'css/layui.css' %}">
{% endblock %}
{% block content %}
<div class="container">
<h1>{{ title }}</h1>
{# 由于我们enctype="multipart/form-data"必须要加 #}
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{% for field in form %}
{# field.label这里面就是获取我们在models.py里面创建表格里面的每一个字段里面有个verbose_name这个参数的值 #}
<label for="exampleInputEmail1">{{ field.label }}</label>
{{ field }}
{# 展示错误信息 #}
<span style="color: red">{{ field.errors.0 }}</span>
<br>
{% endfor %}
<button type="submit" class="btn btn-success">提交</button>
</form>
</div>
{% endblock %}
二、资产表格文件上传功能
我们需要在资产表格上方在添加数据按钮的右边, 添加一个上传表格的按钮。
<a href="/assets/add/" class="btn btn-success">添加信息</a>
<button type="button" class="btn btn-success" data-toggle="modal" data-target="#myModal">
表格上传
</button>
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
aria-hidden="true">×</span></button>
<h4 class="modal-title" id="myModalLabel">选择表格</h4>
</div>
<div class="modal-body">
<form action="/asset/file/" method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="excel">
<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
<button type="submit" class="btn btn-primary">提交</button>
</form>
</div>
</div>
</div>
</div>
然后我们在后端编写上传表格的代码:
assets.py:
def asset_file(request):
# 上传excel表格
file_object = request.FILES["excel"]
wb = load_workbook(file_object)
sheet = wb.worksheets[0]
for data in sheet.iter_rows():
mobile = data[0].value
status = data[1].value
times = data[2].value
price = data[3].value
name = data[4].value
# print(mobile, status, times, price, name)
models.Assets.objects.create(mobile=mobile, status=status, create_time=times, price=price, user_id=name)
return redirect("/assets_list/")
这段代码的意思:就是上传一个excel表格, 然后提交成功之后, 数据就会成功的添加到assets表格里面, 那网页里面就可以看到我们添加的数据。这里我们用到了load_workbook, 这个就是用来加载excel表格用的, 这里用到的excel操作, 在博主之前写到的爬虫的文章里面, 有写过使用的方法, 如果不太记得的话, 可以翻一翻以前的文章看看。这里面的逻辑也很简单, 就是获取到上传的excel表格里面的每一列数据, 然后添加到assets表格里面。
配置路由:
urls.py:
"""project_simple URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/4.1/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, re_path
from django.views.static import serve
from django.conf import settings
from project_one.views import depart, user, assets, admin_role, login, Ajax_data, task_data, perform
urlpatterns = [
path('asset/file/', assets.asset_file, name="asset_file")
]
运行结果:
登录后, 到绩效界面:
点击最后一条数据进行修改:
我们可以发现, 在修改数据框里面, 可以正常获取数据。
现在我们对其进行修改:
提交修改数据:
我们发现修改成功!!!
然后再删除最后一条数据(点击最后一行数据的垃圾桶那个图标):
我们发现, 删除也成功了!!!
我们再桌面创建一个excel文件:
里面输入内容:
注意, 需要在第二列和最后一列输入数字, 因为数据库里面存储的数据是smallint类型的, 第二列里面的1代表已使用, 0代表未使用, 最后一列的数据, 是user_id号(这个是外键)。数据千万不能填错, 否则上传excel会失败从而导致报错。
编辑好数据之后, 我们网页里面打开资产表:
然后点击表格上传:
这里面点击选择文件, 在选择文件的时候, 选择我们刚才创建好的excel表格。
点击提交:
提交后的结果:
会把我们excel表格里面的数据, 添加到表格的尾部。
三、代码展示集合
前端:
perform_list.html:
{% extends "index/model_tmp.html" %}
{#{% load static %}#}
{% block content %}
<div class="container">
<a href="/perform/add/" class="btn btn-success">添加信息</a>
<div class="panel panel-success">
<div class="panel-heading">
<h3 class="panel-title">绩效表</h3>
</div>
<div class="panel-body">
<table class="table table-bordered">
<thead>
<tr>
<th>ID</th>
<th>订单号</th>
<th>客户来源</th>
<th>客户名称</th>
<th>成交时间</th>
<th>成交价格</th>
<th>销售人员</th>
<th>详情</th>
{% if request.unicom_role == 3 %}
<th>操作</th>
{% endif %}
</tr>
</thead>
<tbody>
{% for data in perform_list %}
<tr>
<th scope="row">{{ data.id }}</th>
<th>{{ data.oid }}</th>
<th>{{ data.source }}</th>
<th>{{ data.title }}</th>
<th>{{ data.times }}</th>
<th>{{ data.price }}</th>
<th>{{ data.name }}</th>
<th>
<div><a target="_blank" href="/{{ data.image }}/" style="width: 60px; height: 60px;"><img style="object-fit: cover; border-radius: 100px;" src="/{{ data.image }}/" width="60" height="60" alt="图片无法加载"></a></div>
</th>
{% if request.unicom_role == 3 %}
<td style="color: green">
<a href="/perform/{{ data.id }}/modify"><span style="color: green;" class="glyphicon glyphicon-pencil" aria-hidden="true"></span></a>
<a href="/perform/{{ data.id }}/delete"><span style="color: red;" class="glyphicon glyphicon-trash" aria-hidden="true"></span></a>
</td>
{% endif %}
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
{# 实现分页查询 #}
<ul class="pagination">
{{ page_string }}
</ul>
</div>
{% endblock %}
perform_add_modify.html:
{% extends "index/model_tmp.html" %}
{% load static %}
{% block css %}
<link rel="stylesheet" href="{% static 'css/layui.css' %}">
{% endblock %}
{% block content %}
<div class="container">
<h1>{{ title }}</h1>
{# 由于我们enctype="multipart/form-data"必须要加 #}
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{% for field in form %}
{# field.label这里面就是获取我们在models.py里面创建表格里面的每一个字段里面有个verbose_name这个参数的值 #}
<label for="exampleInputEmail1">{{ field.label }}</label>
{{ field }}
{# 展示错误信息 #}
<span style="color: red">{{ field.errors.0 }}</span>
<br>
{% endfor %}
<button type="submit" class="btn btn-success">提交</button>
</form>
</div>
{% endblock %}
assets_list.html:
{% extends "index/model_tmp.html" %}
{% block content %}
<div class="container">
<a href="/assets/add/" class="btn btn-success">添加信息</a>
<button type="button" class="btn btn-success" data-toggle="modal" data-target="#myModal">
表格上传
</button>
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
aria-hidden="true">×</span></button>
<h4 class="modal-title" id="myModalLabel">选择表格</h4>
</div>
<div class="modal-body">
<form action="/asset/file/" method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="excel">
<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
<button type="submit" class="btn btn-primary">提交</button>
</form>
</div>
</div>
</div>
</div>
{# 实现搜素查询 #}
<div style="float: right">
<form method="get">
<div class="input-group" style="float: right;width: 300px;">
<input type="text" class="form-control" name="search" placeholder="Search for...">
<span class="input-group-btn">
<button class="btn btn-default" type="submit">搜索</button>
</span>
</div>
</form>
</div>
<div class="panel panel-danger">
<div class="panel-heading">
<h3 class="panel-title">资产表</h3>
</div>
<div class="panel-body">
<table class="table table-hover">
<thead>
<tr>
<th>ID</th>
<th>手机号</th>
<th>状态</th>
<th>创建时间</th>
<th>使用者</th>
<th>价格</th>
</tr>
</thead>
<tbody>
{% for data in assets_list %}
<tr>
<th scope="row">{{ data.id }}</th>
<td>{{ data.mobile }}</td>
{% if data.status == 1 %}
<td style="color: green">{{ data.get_status_display }}</td>
{% else %}
<td style="color: red">{{ data.get_status_display }}</td>
{% endif %}
<td>{{ data.create_time|date:"Y-m-d" }}</td>
<td>{{ data.user.name }}</td>
<td>{{ data.price }}</td>
<td style="color: green">
<a href="/assets/{{ data.id }}/modify"><span style="color: green;"
class="glyphicon glyphicon-pencil"
aria-hidden="true"></span></a>
<a href="/assets/{{ data.id }}/del/"><span style="color: red;"
class="glyphicon glyphicon-trash"
aria-hidden="true"></span></a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
{# 实现分页查询 #}
<ul class="pagination">
{{ page_string }}
</ul>
</div>
{% endblock %}
后端:
perform.py:
from datetime import datetime
from django.shortcuts import render, redirect
from django import forms
from project_one.utils.PageData import PageData
import os
from project_one import models
# Create your views here.
def perform_info(request):
perform_list = models.Perform.objects.all()
page_object = PageData(request, perform_list)
content = {
"perform_list": page_object.page_queryset,
"page_string": page_object.page_html()
}
return render(request, "perform/perform_list.html", content)
class PerformForm(forms.Form):
oid = forms.CharField(label="订单号",
widget=forms.TextInput(attrs={"class": "form-control", "autocomplete": "off"}))
source = forms.CharField(label="客户来源",
widget=forms.TextInput(attrs={"class": "form-control", "autocomplete": "off"}))
title = forms.CharField(label="客户名称",
widget=forms.TextInput(attrs={"class": "form-control", "autocomplete": "off"}))
price = forms.CharField(label="成交价格",
widget=forms.TextInput(attrs={"class": "form-control", "autocomplete": "off"}))
image = forms.FileField(label="详情")
def add_perform(request):
if request.method == "GET":
title = "添加绩效信息"
form = PerformForm()
content = {"title": title, "form": form}
return render(request, "perform/perform_add_modify.html", content)
# 如果要上传文件的话, request.FILES千万不能漏掉
form = PerformForm(data=request.POST, files=request.FILES)
if form.is_valid():
# 获取提交过来的文件对象
image_object = form.cleaned_data.get("image")
# 拼接路径
# image_object.name这个就是文件名字,
# os.path.join("media", image_object.name)就代表用media文件夹拼接文件名字,
# 也就是把路径变为:文件夹/文件名。
# 但是最后的路径为:文件夹\文件名。所以需要把\替换成/, 注意要写成\\,
# 因为反斜杠它在正则表达式里面本身就有自己的意义, 所以这里需要转义操作。
print(os.path.join("media", image_object.name))
file_path = os.path.join("media", image_object.name).replace("\\", "/")
print(file_path)
# 将文件存储在media目录当中
with open(file_path, "wb") as file:
for chunk in image_object.chunks():
file.write(chunk)
oid = form.cleaned_data.get("oid")
source = form.cleaned_data.get("source")
title = form.cleaned_data.get("title")
times = datetime.now().strftime("%Y-%m-%d")
price = form.cleaned_data.get("price")
name = request.session['info']['username']
models.Perform.objects.create(oid=oid, source=source, title=title, times=times, price=price, name=name, image=file_path)
return redirect("/perform/list/")
return render(request, "perform/perform_add_modify.html", {"form": form})
class PerformModifyModelForm(forms.ModelForm):
class Meta:
model = models.Perform
fields = ["oid", "source", "title", "price"]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for name, field in self.fields.items():
field.widget.attrs = {"class": "form-control"}
def modify_perform(request, nid):
title = "修改绩效信息"
query_set = models.Perform.objects.filter(id=nid).first()
if request.method == "GET":
form = PerformModifyModelForm(instance=query_set)
content = {"form": form, "title": title}
return render(request, "perform/perform_add_modify.html", content)
form = PerformModifyModelForm(data=request.POST, files=request.FILES, instance=query_set)
if form.is_valid():
form.save()
return redirect("/perform/list/")
return render(request, "perform/perform_add_modify.html", {"form": form, "title": title})
def delete_file(request, nid):
# 如果当前这张图片只会出现一次,文件+数据表内容一起删除
# 如果文件出现多次
path_obj = models.Perform.objects.filter(id=nid).first()
# 获取当前文件路径
filepath = path_obj.image
path_obj.delete()
try:
# 将文件进行删除
os.remove(filepath)
except:
return redirect("/perform/list/")
return redirect("/perform/list/")
assets.py:
from django.core.exceptions import ValidationError
from django.core.validators import RegexValidator
from django.shortcuts import render, redirect
from openpyxl.reader.excel import load_workbook
from project_one.utils.PageData import PageData
from django import forms
from project_one import models
# Create your views here.
def assets(request):
# assets_list = models.Assets.objects.all()
# 搜索信息
dict_data = {}
# 获取搜素框里的内容, 就是获取网址里面的search参数的值
value = request.GET.get('search')
if value:
# 在表格中搜素包含输入框当中的数据, 这里搜素的是手机号, key为mobile__contains
dict_data["mobile__contains"] = value
assets_list = models.Assets.objects.filter(**dict_data)
page_object = PageData(request, assets_list)
# mark_safe也是django框架里面的函数, 需要手动导入, 导入语句为from django.utils.safestring import mark_safe
page_string = page_object.page_html()
# 不能忘记将page_string传给前端。
return render(request, "assets/assets_list.html",
{"assets_list": page_object.page_queryset, "page_string": page_string})
class AssetsAddModelForm(forms.ModelForm):
# validators是手机号格式校验, 里面是校验规则, 需要用到RegexValidator函数
# RegexValidator函数需要在导入的时候写:from django.core.validators import RegexValidator
mobile = forms.CharField(label="手机号", validators=[RegexValidator(r"^1[3-9]\d{9}")])
class Meta:
model = models.Assets
fields = "__all__"
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for name, field in self.fields.items():
field.widget.attrs = {"class": "form-control"}
def clean_mobile(self):
mobile = self.cleaned_data["mobile"]
# 在数据表当中判断是否存在, filter里面的mobile代表以电话号码为判断依据
# 因为我们添加数据的时候, 手机号不能重复添加, 所以需要判断是否存在。
exists = models.Assets.objects.filter(mobile=mobile).exists()
if exists:
# 如果手机号已存在, 则抛出异常
# 这个异常函数, 在导入的时候写:from django.core.exceptions import ValidationError
raise ValidationError("手机号已存在")
return mobile
def assets_add(request):
if request.method == "GET":
title = "添加资产"
form = AssetsAddModelForm()
return render(request, "assets/assets_modelform.html", {"form": form, "title": title})
form = AssetsAddModelForm(request.POST)
if form.is_valid():
form.save()
return redirect("/assets_list/")
return render(request, "assets/assets_modelform.html", {"form": form})
class AssetsModifyModelForm(forms.ModelForm):
# 禁止编辑价格那栏输入框
price = forms.CharField(disabled=True, label="价格")
class Meta:
model = models.Assets
fields = "__all__"
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for name, field in self.fields.items():
field.widget.attrs = {"class": "form-control"}
def clean_mobile(self):
mobile = self.cleaned_data["mobile"]
# self.instance.pk这个代表获取当前数据的id
exists = models.Assets.objects.exclude(id=self.instance.pk).filter(mobile=mobile).exists()
if exists:
raise ValidationError("手机号已存在")
return mobile
def assets_modify(request, nid):
data_list = models.Assets.objects.filter(id=nid).first()
if request.method == "GET":
title = "修改数据"
form = AssetsModifyModelForm(instance=data_list)
return render(request, "assets/assets_modelform.html", {"form": form, "title": title})
form = AssetsModifyModelForm(request.POST, instance=data_list)
if form.is_valid():
form.save()
return redirect("/assets_list/")
return render(request, "assets/assets_modelform.html", {"form": form})
def assets_del(request, nid):
models.Assets.objects.filter(id=nid).delete()
return redirect("/assets_list/")
def asset_file(request):
file_object = request.FILES["excel"]
wb = load_workbook(file_object)
sheet = wb.worksheets[0]
for data in sheet.iter_rows():
mobile = data[0].value
status = data[1].value
times = data[2].value
price = data[3].value
name = data[4].value
# print(mobile, status, times, price, name)
models.Assets.objects.create(mobile=mobile, status=status, create_time=times, price=price, user_id=name)
return redirect("/assets_list/")
urls.py:
"""project_simple URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/4.1/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, re_path
from django.views.static import serve
from django.conf import settings
from project_one.views import depart, user, assets, admin_role, login, Ajax_data, task_data, perform
urlpatterns = [
# path('admin/', admin.site.urls),
re_path(r"^media/(?P<path>.*)$", serve, {"document_root": settings.MEDIA_ROOT}),
path("", depart.index, name="index"),
path("depart/", depart.depart, name="depart"),
path("depart/add/", depart.add_depart, name="add_depart"),
path("depart/<int:nid>/modify/", depart.depart_modify, name="depart_modify"),
path("depart/<int:nid>/del/", depart.del_depart, name="del_depart"),
path("user/", user.user_info, name="user_info"),
path("user/add/", user.user_add, name="user_add"),
path("user/<int:nid>/modify/", user.user_modify, name="user_modify"),
path("user/<int:nid>/del/", user.user_del, name="user_del"),
path("user/add/modelform", user.user_add_modelform, name="user_add_modelform"),
path("user/<int:nid>/modify/modelform", user.user_modify_modelform, name="user_modify_modelform"),
path("assets_list/", assets.assets, name="assets"),
path("assets/add/", assets.assets_add, name="assets_add"),
path("assets/<int:nid>/modify/", assets.assets_modify, name="assets_modify"),
path("assets/<int:nid>/del/", assets.assets_del, name="assets_del"),
path('asset/file/', assets.asset_file, name="asset_file"),
path("admin_list/", admin_role.admin, name="admin"),
path("admin/add/", admin_role.admin_add, name="admin_add"),
path("admin/<int:nid>/modify/", admin_role.admin_modify, name="admin_modify"),
path("admin/<int:nid>/reset/pwd/", admin_role.admin_reset_pwd, name="admin_reset_pwd"),
path("admin/<int:nid>/del/", admin_role.admin_del, name="admin_del"),
path("login/", login.login, name="login"),
path("logout/", login.logout, name="logout"),
path("image/code/", login.image_code, name="image_code"),
path("demo/list/", Ajax_data.demo_list, name="demo_list"),
path("demo/one/", Ajax_data.demo_one, name="demo_one"),
path("demo/two/", Ajax_data.demo_two, name="demo_two"),
path("task/list/", task_data.task_list, name="task_list"),
path("task/add/", task_data.task_add, name="task_add"),
path('task/del/', task_data.task_delete, name="task_delete"),
path('task/modify/', task_data.task_modify, name="task_modify"),
path('task/modify/content/', task_data.task_modify_content, name="task_modify_content"),
path("perform/list/", perform.perform_info, name="perform_info"),
path("perform/add/", perform.add_perform, name="add_perform"),
path("perform/<int:nid>/modify/", perform.modify_perform, name="modify_perform"),
path("perform/<int:nid>/delete/", perform.delete_file, name="delete_file"),
]
好了, 这篇文章关于表格上传已经之前的修改删除功能, 就这样到此结束了, 整个django项目基本也就做的差不多了, 之后的文章, 就会讲整个项目怎么去部署了。
以上就是Django框架的表格上传功能的所有内容了, 如果有哪里不懂的地方,可以把问题打在评论区, 欢迎大家在评论区交流!!!
如果我有写错的地方, 望大家指正, 也可以联系我, 让我们一起努力, 继续不断的进步.
学习是个漫长的过程, 需要我们不断的去学习并掌握消化知识点, 有不懂或概念模糊不理解的情况下,一定要赶紧的解决问题, 否则问题只会越来越多, 漏洞也就越老越大.
人生路漫漫, 白鹭常相伴!!!