用Django设计简易订单附件管理系统-3

boyanx2个月前技术教程16

9、创建超级用户

在与manage.py同级,运行如下命令:

python manage.py createsuperuser

然后输入用户名,密码

然后重新启动服务,访问127.0.0.1:8000/admin/,出现django后台管理登录界面



输入刚才创建的用户名及密码后进行登录

此时里面啥都没有,稍后我们进行admin.py的配置。



10、配置admin.py

通过在attachMana目录下的admin.py中添加如下代码:

from django.contrib import admin
from .models import AttachModel

class AttachModelAdmin(admin.ModelAdmin):
    list_display = ('orderNumber','custId','fileName','owner','create_time')
    fields = ('orderNumber','custId','fileObj')

admin.site.register(AttachModel,AttachModelAdmin)

其中list_sisplay是元组或列表,是订单附件管理表中能看到的字段,而fields则是在添加数据时显示的字段。

重新运行服务,访问127.0.0.1:8000/admin/,登录后就能看到以下界面了



点击增加,为订单附件管理表添加一个文件,此时看到的就是fields里的字段:



随便添加了一个文件并保存,在项目的upload/2020/09/11/目录里就有了刚上传的文件。

但在管理界面中发现没有文件名及上传者,接下来我们需要修改admin.py


为admin.py添加一个save_model方法:

def save_model(self, request, obj, form, change):
    obj.owner = request.user
    obj.fileName = request.FILES['fileObj'].name
    return super(AttachModelAdmin,self).save_model(request,obj,form,change)

这样在更新前就会得到当前用户名与文件名。

如果在admin后台将数据删除,只是删除掉表格中的数据,文件并不会删除。

11、编制index.html,使访问127.0.0.1:8000时就路由到index.html

首先在template目录下创建一个index.html文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>订单附件查询</title>
</head>
<body>
    这是index.html的内容
</body>
</html>

urls.py维持原来的不变。

改变views.py的代码为:

class Index(View):

    def get(self,request):
        return render(request,'index.html',context={})

接着还需要修改settings.py中的关于模板的设置:

TEMPLATES
'DIRS': [os.path.join(BASE_DIR,'template')],

重启服务后,再次访问127.0.0.1:8000,将是index.html的内容,而非原来的HttpResponse的内容。


12、编制index.html界面

界面分上下两部分,上面是一个表单,用来输入要搜索的条件,下面是表格,用来展示数据,由于不擅长前端,并且是公司内部使用,也就没去搞美化了,只在网上去找了个通用的表格样式。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>订单附件查询</title>
    <link rel="stylesheet" href="/static/css/table.css">
</head>
<body>
    <form action="search/" method="post">
        订单号:<input type="text" name="orderNumber">
        顾客编号:<input type="text" name="custId">
        文件名:<input type="text" name="fileName">
        <input type="checkbox" name="onDate">
        从 <input type="date" name="startDate">
        到 <input type="date" name="endDate">
        <input type="submit" value="查询">
    </form>
    <hr>
    <table class="data-table">
        <tr><th>订单号</th><th>顾客编号</th><th>文件名</th><th>上传者</th><th>上传日期</th><th>操作</th></tr>
        {% for row_data in datas %}
            <tr>
                <td>{{ row_data.orderNumber }}</td>
                <td>{{ row_data.custId }}</td>
                <td>{{ row_data.fileName }}</td>
                <td>{{ row_data.owner }}</td>
                <td>{{ create_time }}</td>
                <td>下载</td>
            </tr>
        {% endfor %}
    </table>
</body>
</html>

界面如下:



13、编制查询功能

在urls.py中添加新的路由:

path('search/',views.Search.as_view(),name='search'),

在views.py中添加如下代码:

class Search(View):
    def post(self,request):
        return render(request,'index.html',context={})

我们重启服务,看看点击查询按钮会不会出错,如果不出错,那再接着编写Search的代码。

结果出现了CSRF验证失败。


在index.html的from中间添加如下代码:

{% csrf_token %}

再次点击查询按钮时,网页可正常跳转,并未出错。不过我再次点击查询时就出现错误了,url会变为
127.0.0.1:8000/search/search/,我们修改form中的action,由原来的”search/”改为”/search/”然后就正常了。

通畅以后,我们就可以编写search代码了。

from attachMana.models import AttachModel
 
class Search(View):

    def post(self,request):
        params = {}
        params['orderNumber'] = request.POST.get('orderNumber')
        params['custId'] = request.POST.get('custId')
        params['fileName'] = request.POST.get('fileName')
        params['onDate'] = request.POST.get('onDate')
        params['startDate'] = request.POST.get('startDate')
        params['endDate'] = request.POST.get('endDate')
        if params['onDate']:
            # 如果有勾选日期前面的checkbox,表示启用日期查询
            datas = AttachModel.objects.filter(orderNumber__contains=params['orderNumber']).filter(orderNumber__contains=params['custId']).filter(orderNumber__contains=params['fileName']).filter(create_time__range=(params['startDate'],params['endDate']))[:100]
        else:
            datas = AttachModel.objects.filter(orderNumber__contains=params['orderNumber']).filter(orderNumber__contains=params['custId']).filter(orderNumber__contains=params['fileName'])[:100]
        return render(request,'index.html',context={'datas':datas})

由于对提交的post数据验证还不熟悉,所以暂未设计验证。

重启服务后,现在点击查询就能搜索出数据并且放置到前端页面的表格中了。


标签: superadmin

相关文章

自营性电商项目④_自营式电商平台缺点

类别管理--根据id查询类别详情--持久层13.1. 规划SQL语句本次需要执行的SQL语句大致是:select * from pms_category where id=?关于字段列表,应该包括:i...

Django干货知识分享,Admin管理工具

您好,欢迎来到这里学习Django框架,关注我会持续更新内容哦~如果本文对您有帮助,还请您点赞转发哦,谢谢!创建超级管理员python3 manage.py createsuperuser User...

Golang之Gorm学习笔记_golang mpi

一、模型定义1. 模型定义模型是标准的 struct,由 Go 的基本数据类型、实现了 Scanner 和 Valuer 接口的自定义类型及其指针或别名组成,如:type User struct {...

大数据Hadoop之——Hadoop HDFS多目录磁盘扩展与数据平衡实战操作

一、概述hdfs 需要存写大量文件,有时磁盘会成为整个集群的性能瓶颈,所以需要优化 hdfs 存取速度,将数据目录配置多磁盘,既可以提高并发存取的速度,还可以解决一块磁盘空间不够的问题。Hadoop...

SpringBoot 使用 Sa-Token 完成路由拦截鉴权

一、需求分析在前文,我们详细的讲述了在 Sa-Token 如何使用注解进行权限认证,注解鉴权虽然方便,却并不适合所有鉴权场景。假设有如下需求:项目中所有接口均需要登录认证校验,只有 “登录接口” 本身...

Spring Boot 注解实战:30 行代码搞定字段级权限控制

Spring Boot 注解实战:30 行代码搞定字段级权限控制在企业级应用开发中,权限控制是一个绕不开的话题。从粗粒度的 URL 级权限,到细粒度的方法级权限,再到今天要聊的字段级权限,我们的安全边...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。