关于Python+Django+Hadmin的初级使用
大家好,我是Python开发新手,以前一直在使用Shell和Php脚本,Python使用基本都很少,这两年Python越来越火,咱们做运维的再不使用Python等待何时呢,开个玩笑。
这几天一直在看Python+Django框架,写了一个简单的数据库web管理,并且也套用了较为流程的Bootstrap和Hadmin前端框架,使用Hadmin前端框架,发现其前端的功能实在是太强大了,在这里我把我的代码分享一下。
models.py
from django.db import models
class 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
from django.views.decorators.csrf import csrf_protect
from StudentS.models import Students
@csrf_protect
//插入数据库
def insert(request):
cook = request.COOKIES.get(‘cookie_username’)
if cook is not None:
if request.POST:
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’: “成功添加数据!”})
return render(request, ‘add.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')
//默认登录首页
def index(request):
return render(request, 'login.html') # request,地址,参数
//用户登录认证及cookies生成
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 response
else:
return render(request, ‘login.html’, {‘error’: ‘username or password error’}) # 不正确,通过render(request,“login.html”)方法在error标签处显示错误提示
//从数据库中取出数据,用于展现在Hadmin的前端页面表格中
def data(request):
context = {} # 封装返回参数
results = Students.objects.all()
# sql = ‘SELECT * FROM students_students’
# cur.execute(sql) # 执行SQL语句
# results = cur.fetchall() # 获取所有记录,列表查询所有
r = []
for i in results:
tmp = {}
tmp["id"] = i.id
tmp["school_name"] = i.school_name
tmp["grade_num"] = i.grade_num
tmp["class_num"] = i.class_num
tmp["name"] = i.name
tmp["sex"] = i.sex
tmp["age"] = i.age
tmp["hob"] = i.hob
r.append(tmp)
rowNum = 10
//rows为Hadmin表格页的记录集,records是记录数,pages是每页显示10条记录,默认的显示页数
return 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 admin
from StudentS import views
urlpatterns = [
url(r’^
′
,
v
i
e
w
s
.
i
n
d
e
x
)
,
u
r
l
(
r
′
a
d
d
/
', views.index), url(r'^add/
′,views.index),url(r′add/’, views.insert),
url(r’^show/
′
,
v
i
e
w
s
.
s
h
o
w
,
n
a
m
e
=
′
s
h
o
w
′
)
,
u
r
l
(
r
′
d
a
t
a
/
', views.show, name='show'), url(r'^data/
′,views.show,name=′show′),url(r′data/’, views.data),
url(r’^login/$’, views.login, name=‘login’),
url(r’^admin/’, admin.site.urls),
]
add.html(记录添加)
{% load staticfiles %}
性 别:
年 龄:
学 校:
年 级:
班 级:
爱 好:
{{ result }} |
<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>
<div class="wrapper wrapper-content animated fadeInRight">
<div class="row">
<div class="col-sm-12">
<div class="ibox ">
<div class="ibox-title">
<h5>学生信息表{{ aa }}</h5>
</div>
<div class="ibox-content">
<div class="jqGrid_wrapper">
<table id="table_list_1"></table>
<div id="pager_list_1"></div>
</div>
<p> </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.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>
$(document).ready(function () {
$.jgrid.defaults.styleUI = 'Bootstrap';
// Examle data for jqGrid
var mydata = ""
$("#table_list_2").jqGrid({
url: "/data/",
multiselect : true, //是否可以多选,第一列会出现多选按钮控件
loadonce: true, //如果是json数据加载,只加载一次,动静分离,分页完全使用前端来分页,数据显示无需再与后端服务器进行交互
datatype: "json",
height: 450,
autowidth: true,
shrinkToFit: true,
rownumbers: true, //是否显示记录序号,true显示,false隐藏
rowNum: 10,
rowList: [10, 20, 30],
colNames: [ '学校', '年级', '班级', '姓名', '性别', '年龄','爱好'],
colModel: [
{#{ name: 'id', index: 'id', editable: true, width: 60, sorttype: "int", search: true},#}
{ name: 'school_name', index: 'school_name', editable: true, width: 90,},
{ name: 'grade_num', index: 'grade_num', editable: true, width: 40, sorttype: "int"},
{ name: 'class_num', index: 'class_num', editable: true, width: 40, align: "left", sorttype: "int"},
{ name: 'name', index: 'name', editable: true, width: 80, align: "left",},
{ name: 'sex', index: 'sex', editable: true, width: 80, align: "left",},
{ name: 'age', index: 'age', editable: true, width: 100, sorttype: "int"},
{ name: 'hob', index: 'hob', editable: true, width: 80, align: "left",},
],
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",#}
},
pager: "#pager_list_2",
viewrecords: true,
caption: "学生信息表",
add: true,
edit: true,
addtext: 'Add',
edittext: 'Edit',
hidegrid: false,
editurl: "/add/",
});
// 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,
position : 'left',
height: 200,
closeAfterEdit:true,
reloadAfterSubmit: true,
closeOnEscape:true,
editData:{csrfmiddlewaretoken: '{{ csrf_token }}'}
{#editData: {csrfmiddlewaretoken: $.cookie(CSRF_COOKIE_NAME)}#}
//addfunc : openDialog4Adding, // (1) 点击添加按钮,则调用openDialog4Adding方法
//editfunc : openDialog4Updating, // (2) 点击编辑按钮,则调用openDialog4Updating方法
//delfunc : openDialog4Deleting, // (3) 点击删除按钮,则调用openDialog4Deleting方法
//alerttext : "请选择需要操作的数据行!" // (4) 当未选中任何行而点击编辑、删除、查看按钮时,弹出的提示信息
});
// jQuery("#table_list_2").jqGrid('navGrid','#pager_list_2',{});
// Add responsive to jqGrid
$(window).bind('resize', function () {
var width = $('.jqGrid_wrapper').width();
{#$('#table_list_1').setGridWidth(width);#}
$('#table_list_2').setGridWidth(width);
});
});
</script>