关于@Python+Django+Hadmin

关于Python+Django+Hadmin的初级使用V1.0

大家好,上次我发布了一个基本用法,这次我把Hadmin前端的增、删、改、查的功能都结合进去了,实现一整套的动静分离的框架流程,供大家参考使用,随后,我会不断的再这个上面增加一些新的功能和模块上去,希望大家喜欢,谢谢!前后端的代码分享在这里。

models.py

from django.db import modelsclass Students(models.Model):school_name = models.CharField(max_length=10)grade_num = models.IntegerField()class_num = models.IntegerField()name = models.CharField(max_length=30)sex = models.CharField(max_length=2)age = models.IntegerField()hob = models.CharField(max_length=50)def _str__(self):return 'school_name:'+self.school_name+';grade_num:'+str(self.grade_num)+';class_num :'\+ str(self.class_num)+';name:'+self.name+';sex:'+self.sex+';age:'+self.age+';hob:'+self.hob

settings.py

import os
import pymysql
pymysql.install_as_MySQLdb()INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','StudentS.apps.StudentsConfig','ClassStu'                     //上面都是自带的,这个是默认的工程名,是需要自己添加的
]//这格式数据库连接信息
DATABASES = {          'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'ClassStu','USER': 'root','PASSWORD': '12345678','HOST': 'localhost','PORT': '3306',}
}

views.py

from django.contrib.auth import authenticate
from django.shortcuts import render
from django.http.response import JsonResponse
from django.http import HttpResponseRedirect
from django.contrib.auth.models import User
from django.shortcuts import render_to_response
import pymysql
import math# Create your views here.
from django.views.decorators.csrf import csrf_protect
from StudentS.models import Students@csrf_protect
def opera(request):cook = request.COOKIES.get('cookie_username')if cook is not None:if request.POST:# oper = request.get["oper"]# 开始进行插入数据库操作if request.POST['oper'] == 'add':Students.objects.create(school_name=request.POST['school_name'], grade_num=request.POST['grade_num'],class_num=request.POST['class_num'], name=request.POST['name'], sex=request.POST['sex'],age=request.POST['age'], hob=request.POST['hob']),# return render(request, 'add.html', {'result': "成功添加数据!"})# 开始进行更新记录集操作elif request.POST['oper'] == 'edit':Students.objects.filter(id=request.POST['id']).update(school_name=request.POST['school_name'], grade_num=request.POST['grade_num'],class_num=request.POST['class_num'], name=request.POST['name'], sex=request.POST['sex'],age=request.POST['age'], hob=request.POST['hob'])else:Students.objects.filter(id=request.POST['id']).delete()return render(request, 'index.html')# 首页如果没有得到Cookies则放回到login.html进行认证
def show(request):cook = request.COOKIES.get('cookie_username')if cook is not None:return render(request, 'index.html', {'aa': cook})    # request,地址,参数else:return render(request, 'login.html')# 默认打开login.html页面
def index(request):return render(request, 'login.html')    # request,地址,参数def login(request):if request.method == 'POST':  # 判断是否为post提交方式username = request.POST.get('username', ' ')  # 通过post.get()方法获取输入的用户名及密码password = request.POST.get('password', ' ')user = authenticate(username=username, password=password)# userpassjudge = User.objects.filter(username=username, password=password)if user is not None:   # 判断用户名及密码是否正确response = HttpResponseRedirect('/show/')           # 如果正确,(这里调用另一个函数,实现登陆成功页面独立,使用HttpResponseRedirect()方法实现response.set_cookie('cookie_username', username, 3600)return responseelse:return render(request, 'login.html', {'error': 'username or password error'})  # 不正确,通过render(request,"login.html")方法在error标签处显示错误提示# 定义需要传送给Hadmin前端页面的Jason数据集
def data(request):context = {}  # 封装返回参数results = Students.objects.order_by("-id")r = []for i in results:tmp = {}tmp["id"] = i.idtmp["school_name"] = i.school_nametmp["grade_num"] = i.grade_numtmp["class_num"] = i.class_numtmp["name"] = i.nametmp["sex"] = i.sextmp["age"] = i.agetmp["hob"] = i.hobr.append(tmp)rowNum = 10return JsonResponse({"rows": r, "records": len(r), "pages": math.ceil(len(r)/rowNum)})

urls.py

from django.conf.urls import url
from django.urls import path, include
from django.contrib import adminfrom StudentS import viewsurlpatterns = [url(r'^$', views.index),url(r'^opera/$', views.opera),url(r'^show/$', views.show, name='show'),url(r'^data/$', views.data),url(r'^login/$', views.login, name='login'),url(r'^admin/',  admin.site.urls),
]

index.html(显示数据库记录数)

{% load staticfiles %}<html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title> - jqGird</title><meta name="keywords" content=""><meta name="description" content=""><link rel="shortcut icon" href="favicon.ico"> <link href="{% static 'css/bootstrap.min.css'%}?v=3.3.6 " rel="stylesheet"><link href="{% static 'css/font-awesome.css'%}?v=4.4.0 " rel="stylesheet"><!-- jqgrid--><link href="{% static 'css/plugins/jqgrid/ui.jqgrid.css'%}?0820" rel="stylesheet"><link href="{% static 'css/animate.css'%}" rel="stylesheet"><link href="{% static 'css/style.css'%}?v=4.1.0 " rel="stylesheet">  <style>/* Additional style to fix warning dialog position */#alertmod_table_list_2 {top: 900px !important;}</style>
</head>
<body class="gray-bg"><div class="wrapper wrapper-content  animated fadeInRight"><div class="row"><div class="col-sm-12"><div class="ibox "><div class="ibox-title"><h5>学生信息表</h5></div><div class="ibox-content"><div class="jqGrid_wrapper"><table id="table_list_1"></table><div id="pager_list_1"></div></div><p>&nbsp;</p><div class="jqGrid_wrapper"><table id="table_list_2"></table><div id="pager_list_2"></div></div></div></div></div></div></div><!-- 全局js -->
{#    <script src="{% static 'js/jquery.cookie.js' %}?v=1.4.1"></script>#}<script src="{% static 'js/jquery.min.js' %}?v=2.1.4"></script><script src="{% static 'js/bootstrap.min.js' %}?v=3.3.6"></script><!-- Peity --><script src="{% static 'js/plugins/peity/jquery.peity.min.js' %}"></script><!-- jqGrid --><script src="{% static 'js/plugins/jqgrid/i18n/grid.locale-cn.js' %}?0820"></script><script src="{% static 'js/plugins/jqgrid/jquery.jqGrid.min.js' %}?0820"></script><!-- 自定义js --><script src="{% static 'js/content.js' %}?v=1.0.0"></script><!-- Page-Level Scripts --><script>function schoolcheck(value,school_name) {if (value == "")return [false,"学校: 此字段必需"];elsereturn [true,""];}$(document).ready(function () {$.jgrid.defaults.styleUI = 'Bootstrap';// Examle data for jqGridvar mydata = ""$("#table_list_2").jqGrid({url: "/data/",multiselect : true,             //是否可以多选,第一列会出现多选按钮控件loadonce: true,                 //如果是json数据加载,只加载一次,动静分离,分页完全使用前端来分页,数据显示无需再与后端服务器进行交互datatype: "json",               //接收服务传过来的标准json串height: 450,                    //主表格的高度pager: "#pager_list_2",         //导航栏对象,必须是一个有效的html元素,位置可以随意viewrecords: true,              //是否要显示总记录数信息caption: "学生信息表",           //表格名称hidegrid: false,                //表格是否隐藏sortname:'id',                  //设置默认排序字段sortorder: 'desc',              //倒序editurl: "/opera/",{#editData:{csrfmiddlewaretoken: '{{ csrf_token }}'},#}autowidth: true,shrinkToFit: true,recordpos: 'right', //总记录显示位置:居右rownumbers: true,   //是否显示记录序号,true显示,false隐藏rownumWidth: 50,rowNum: 10,rowList: [10, 20, 30],colNames: ['id', '学校', '年级', '班级', '姓名', '性别', '年龄','爱好'],colModel: [{   name: 'id', index: 'id', editable: true, width: 60, sorttype: "int", search: true,hidden:true,},{   name: 'school_name', index: 'school_name', editable: true, width: 90, editrules:{custom:true,custom_func:schoolcheck}},{   name: 'grade_num', index: 'grade_num', editable: true, width: 40, sorttype: "int", editrules:{required:true,number:true}},{   name: 'class_num', index: 'class_num', editable: true, width: 40, align: "left", sorttype: "int", editrules:{required:true,number:true}},{   name: 'name', index: 'name', editable: true, width: 80, align: "left", editrules:{required:true}},{   name: 'sex', index: 'sex', editable: true, width: 80, align: "left", editrules:{required:true}},{   name: 'age', index: 'age', editable: true, width: 100, sorttype: "int", editrules:{required:true,number:true}},{   name: 'hob', index: 'hob', editable: true, width: 80, align: "left", editrules:{required:true}},],jsonReader: {                          //描述json 数据格式的数组,需修改root: 'rows',                   // 接收并显示所有数组数据page: "current",                // json中代表当前页码的数据total: "pages",                 // json中代表页码总数的数据records: "total",               // json中代表数据行总数的数据repeatitems: false,             // 如果设为false,则jqGrid在解析json时,会根据name来搜索对应的数据元素(即可以json中元素可以不按顺序);而所使用的name是来自于colModel中的name设定。{#cell: "cell",#}{#id: "fRoleId",#}{#userdata: "userdata",#}},prmNames : {page:"page", // 表示请求页码的参数名称rows:"rows", // 表示请求行数的参数名称sort: "sidx", // 表示用于排序的列名的参数名称order: "sord", // 表示采用的排序方式的参数名称search:"_search", // 表示是否是搜索请求的参数名称nd:"nd", // 表示已经发送请求的次数的参数名称id:"id", // 表示当在编辑数据模块中发送数据时,使用的id的名称oper:"oper", // operation参数名称editoper:"edit", // 当在edit模式中提交数据时,操作的名称addoper:"add", // 当在add模式中提交数据时,操作的名称deloper:"del", // 当在delete模式中提交数据时,操作的名称},loadComplete: function (a, b, c) {jQuery("#table_list_2").jqGrid('setLabel', 'rn', '序号', {'text-align': 'center','vertical-align': 'middle',"width": "50"});$("table[role='grid']").each(function () {//jqgrid 创建的表格都有role属性为grid$('.' + $(this).attr("class") + ' tr:first th:first').css("width", "50"); //使表头的序号列宽度为40$('.' + $(this).attr("class") + ' tr:first td:first').css("width", "50"); // 使表体的序号列宽度为40});},});// Add selection{#$("#table_list_2").setSelection(4, true);#}// Setup buttons$("#table_list_2").jqGrid('navGrid', '#pager_list_2', {edit: true,add: true,del: true,search: true,addtext: '添加',edittext: '编辑',deltext: '删除',searchtext:'查找',position : 'left',height: 200,closeAfterEdit:true,closeAfterAdd: true,        //Closes the add window after addreloadAfterSubmit: true,closeOnEscape:true,});// Add responsive to jqGrid$(window).bind('resize', function () {var width = $('.jqGrid_wrapper').width();$('#table_list_2').setGridWidth(width);});});//Start--以下为解决添加或者编辑表单数据时用于传递crsf_token的两个javascript的代码段// 这个才是重点的代码,必须写function getCookie(name) {var cookieValue = null;if (document.cookie && document.cookie !== '') {var cookies = document.cookie.split(';');for (var i = 0; i < cookies.length; i++) {var cookie = jQuery.trim(cookies[i]);// Does this cookie string begin with the name we want?if (cookie.substring(0, name.length + 1) === (name + '=')) {cookieValue = decodeURIComponent(cookie.substring(name.length + 1));break;}}}return cookieValue;}// 这个才是重点的代码,必须写function csrfSafeMethod(method) {// these HTTP methods do not require CSRF protectionreturn (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));}csrftoken = getCookie('csrftoken');$.ajaxSetup({  //添加头部信息,csrftoken, 把token塞入头部beforeSend: function(xhr, settings) {if (!csrfSafeMethod(settings.type) && !this.crossDomain) {xhr.setRequestHeader("X-CSRFToken", csrftoken);}}});//End--以上为解决添加或者编辑表单数据时用于传递crsf_token的两个javascript的代码段</script></body></html>

添加记录图片

添加记录的时候,需要对字段进行判断,比如不能为空、必须是数字等,在index.html的前端页已经详细的定义,请看index.html页面的注释

删除记录图片

删除记录前端使用默认的Hadmin框架,后端在View.py里面编写后台删除的代码段即可。

编辑记录图片

编辑记录前端使用默认的Hadmin框架,后端在View.py里面编写后台编辑的代码段即可。

Python+Django+Hadmin的初级使用V1.0相关推荐

  1. python django实现的图书管理系统v1.0

    图书管理系统v1.0 middlewares.py from django.utils.deprecation import MiddlewareMixin from django.shortcuts ...

  2. python实现简单的小说下载V1.0

    @[TOC] python实现简单的小说下载V1.0 需求来源于很多方面,闲来无事练手了 仅用于练习使用,不建议用在其他方面 建议下载参考对比 先来一段代码 import random import ...

  3. 肝了我好久,《Python知识手册V1.0》出来了!!!

    最近这段时间,每天抽空整理了一份Python知识手册,当然也可以称为Python面试手册.以问答的形式去整理,包含基础篇.进阶篇.练习篇.爬虫篇.正则篇.Flask篇.Django篇.目前版本V1.0 ...

  4. KLite 移植说明 V1.0

    2019独角兽企业重金招聘Python工程师标准>>> KLite 移植说明 V1.0 KLite是一个"简洁易用"的嵌入式操作系统微内核 目前支持Cortex- ...

  5. 基于python的智能家居系统_基于Python Django的可扩展智能家居系统

    基于 Python Django 的可扩展智能家居系统 龚 鸣,余杨志,邓宏涛 * [摘 要] 针对现阶段智能家居系统智能化迭代开发的需求,分析当前智能家居 系统主控的相关实现技术,提出了基于 Pyt ...

  6. 【Azu Cloud云盘 V1.0】基于python django写的云盘 全开源分享

    Azu Cloud 欢迎使用Azu Cloud云盘 V1.0 新的改变 如何使用 注册教程 左上角图标(登录后) 如何上传文件 如何分享? 分享链接如何使用? 口令如何使用? 图像 视频 音频等如何在 ...

  7. 《大厂算法面试题目与答案汇总,剑指offer等常考算法题思路,python代码》V1.0版...

    为了进入大厂,我想很多人都会去牛客.知乎.CSDN等平台去查看面经,了解各个大厂在问技术问题的时候都会问些什么样的问题. 在看了几十上百篇面经之后,我将算法工程师的各种类型最常问到的问题都整理了出来, ...

  8. 自动化测试平台化[v1.0.0][Django模型]

    设计系统表 Django提供了完善的模型层,来创建和存取数据,它包含你所储存数据的必要字段和行为,每个模型对应数据库中唯一的一张表,模型避免了我们直接对数据库的操作 每个模型是一个Python类,集成 ...

  9. python第七关再来一盘_盘一盘 Python 系列 7 - PyEcharts (v1.0)

    原标题:盘一盘 Python 系列 7 - PyEcharts (v1.0) 本文含5835字,33图表截屏 建议阅读30分钟 0 引言 有读者说[ PyEcharts ]一贴里的图美如画,但是版本是 ...

  10. Python 自定义抽取视频关键帧 (可设置抽样频率和相似程度要求) CV2Skimage V1.0

    原目的是侦测文字游戏录屏的画面的变化以推送至负责OCR和翻译的第二个程序处理为字幕文件(就是自动生成文字游戏录屏字幕的项目的一个环节),不过,或许也可以有一些别的用途?注释非常非常之详细,可以看了注释 ...

最新文章

  1. 网页学名为html文件,什么是HTML
  2. 产品图片无缝水平滚动效果代码
  3. linux内核PID管理--命名空间
  4. 滴滴重磅开源跨平台统一 MVVM 框架 Chameleon
  5. 获取当天是当年/当月的第几周
  6. js操作元素节点对象innerHTML
  7. 关于JavaScript中的几种匿名行数的写法
  8. node mysql 连接池创建_Node.js使用MySQL连接池的方法实例
  9. 使用Log4jdbc记录JDBC操作
  10. 循环次数几次_圆柱模板循环使用次数是多少呢
  11. 好看的动态实时时间显示时钟HTML源码
  12. Illustrator 教程,了解 AI 中的绘图工具
  13. ssm教务系统网站 毕业设计-附源码290915
  14. 520送女生什么礼物比较好?一口气推荐六款,快收藏
  15. 计算机通识之TCP/IP协议簇(二)
  16. 安卓逆向Xposed HOOK TB直播APP的x-sign参数
  17. 【松岩论道】一个道理说明股市人的发展不是靠江湖式的随机跳跃分析!
  18. 基于形状匹配的螺丝识别(完整代码)
  19. pytorch中的Variable还有必要使用吗?
  20. Kali的ZMap安装经验总结

热门文章

  1. php旧物交易开源代码_php二手市场交易系统毕业设计(含源文件)
  2. 专为Oracle数据库恢复而生 - PRM
  3. struts2的ActionSupport
  4. C语言小程序打印楼梯图案
  5. c语言立方体的体积和表面积,立方体表面积C语言
  6. 注册表删除计算机用户密码,修改注册表删除WIN10开机密码
  7. protel99se简明实用手册
  8. 利用 Python分析北京雾霾天,发现这么秘密
  9. 酒店结婚播放PPT模板
  10. C# Aspose.Word 操作word文档【一】