Django之表格上传

发布于:2025-06-06 ⋅ 阅读:(14) ⋅ 点赞:(0)

表格上传

目录

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


网站公告

今日签到

点亮在社区的每一天
去签到