Django之表格上传 - 实践

表格上传

目录

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">&times;
        </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">&times;
          </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框架的表格上传功能的所有内容了, 如果有哪里不懂的地方,可以把问题打在评论区, 欢迎大家在评论区交流!!!
如果我有写错的地方, 望大家指正, 也可以联系我, 让我们一起努力, 继续不断的进步.
学习是个漫长的过程, 需要我们不断的去学习并掌握消化知识点, 有不懂或概念模糊不理解的情况下,一定要赶紧的解决问题, 否则问题只会越来越多, 漏洞也就越老越大.
人生路漫漫, 白鹭常相伴!!!

posted @ 2025-07-17 13:36  yjbjingcha  阅读(8)  评论(0)    收藏  举报