python实战WEB-Django (二)
一、继承之前GUI的练习数据,我们继续使用mysql数据库,先设置数据库。
1、编辑settings.py
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', #数据库类型 'NAME': 'test', #数据库名 'USER':'root', #用户名 'PASSWORD':'123456', #密码 'HOST':'127.0.0.1', #地址 'PORT':3306 #端口 } }
(后来发现,在代码中直接用参数调用数据的话,这步可以不做)
二、来做一个前端页面。
查找了很多教程,用表单提交的数据后都是跳转到另一个页面显示,要不就要用其它插件语言来实现,但我现在没有学其它前端语言(真*小白)。最后自己想了个取巧的法子,提交后跳回原页面显示结果,不多说直接还原过程。
1、新建一个前端模板,在app目录下新建 templates文件夹,在其下新建index.html,打开编辑。
一个下拉列表用于选择查询的字段
一个输入栏输入查询的值
一个提交按钮
一个表格显示查询结果
DOCTYPE html>
<head>
<meta charset="UTF-8">
<title>学生信息查询title>
head>
<body>
<h1>学生信息查询:h1>
<form method = "post" action = "/index/">
{% csrf_token %}
选择查询的字段:
<select name = "input_name" >
{% for i in list_n %}
<option>{{i}}option>
{% endfor %}
select><br>
输入要查询的值:
<input type = "text" name = "input_value" placeholder = "请输入正确值" ><br><br>
<input type = "submit" value = "查询">
form>
<br><br>
查询结果:
<table border = "1">
<tr>
{% for i in list_n %}
<td>{{i}}td>
{% endfor %}
tr>
{% for v in list_v %}
<tr>
{% for s in v %}
<td>{{s}}td>
{% endfor %}
tr>
{% endfor %}
table>
body>
html>
以上是完成后的代码,其实一开始只做了显示元素,没有那些逻辑,也是搞了很久才搞明白数据交互的语法和html里逻辑运算的语法,原以为不需要研究太多Django,还是花了大力气去了解,走了很多错路,痛苦!
三、后台数据处理。
1、修改视图文件,创建一个index函数。
from django.shortcuts import render # Create your views here. import mysql.connector class sql: def __init__(self): self.con = mysql.connector.connect( host="localhost", # 数据库主机地址 user="root", # 数据库用户名 passwd="123456", # 数据库密码 database="test" #数据库名称 ) self.cursor = self.con.cursor() def select(self,sql_sr): #类定义了init后下面的函数第一参数必须是self否则引用报错 self.cursor.execute(sql_sr) result = self.cursor.fetchall() return result def insert(self,sql_sr): self.cursor.execute(sql_sr) self.con.commit() print(self.cursor.rowcunt,'新增成功') def index(request): sql_sr = "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'student'" list_name1 = sql().select(sql_sr) list_name = [] for i in list_name1: for s in i: list_name.append(s) input_name = request.POST.get('input_name'); input_value = request.POST.get('input_value'); if input_value: sql_sr1 = "select * from Student where student." + input_name + "=" + "'" + input_value +"'" list_value = sql().select(sql_sr1) return render(request, 'index.html',{'list_n':list_name,'list_v':list_value}) else: return render(request, 'index.html',{'list_n':list_name})
从数据库表头名称作为一个列表list_name传递给模板,因为初始查询出来的数据是以元组为值的数列,样式如下
[('Student_ID',), ('Name',), ('Age',), ('Sex',), ('Class',)]
直接取出的值格式不对,需要做处理。
本来想将list_value也做同样处理再传给前端,后来发现不能这样做,会导致表格显示的列不对,又改为传原始数据让前端来处理
2、修改urls.py,关联index函数。注意修改的是上层文件夹里的,就是和setting同一个文件夹的,我还把app文件夹里的urls删除了。
from django.contrib import admin from django.urls import path from testapp import views urlpatterns = [ path('admin/', admin.site.urls), path('index/',views.index), ]
要把自己的views的函数import出来,不然会报错。
四、结果
初始进入页面:
输入参数进行查询:
五、总结
1、想抛开django来探讨数据交互问题是不行滴,你用了人家的前端还是得了解才能用得转。前面就是因为不了解模板的引用路径问题导致一直报错,不得已删档重来。
2、前端往后台传数据数据其实就用一个post的方法,据说还有一个get方法可以主动从后台获取数据,还没了解。
3、代码量其实不多,更多的时间是花在了解Django语法以及配置上。
总的来说要有一个views文件,里面放置处理函数;
要使得网址打开就能引用这些函数,要将视图文件及基体函数名称配置到urls文件上;
html文件可引用views里变量的值,通过{{i}}的格式;html里所有逻辑语句要用{% %}括起来;
views文件要传变量给html以及调用html页面内容通过render命令实现,传参格式 {'接收名':变量名}