Django学习入门教程
基础部分
须知:
1.HttpResponse 返回字符串
2.Render 返回一个Html文件
3.Redirect 重定向
创建Django项目
创建apps
一、简单配路由
二、接收url的参数
三、url正则表达式传参
四、表单提交(GET、POST、页面跳转)
上面介绍的都属于 FBV 就是function 通过函数处理
下面介绍 CBV 就是 class 通过类
五、登录案例:
综合案例部分
这个案例是一个管理系统:有学生表、班级表、教师表,班级与教师的关系表,对上面四张表进行操作,完成前端网页和后端处理,通过本案例熟悉Django项目的编程。
内容的html部分,界面不是很好看,不过这不是重点,主要了解操作过程就好了。
一、班级表的操作
第一节:读取class表的数据,在界面显示
文件目录:
url路由:
from apps import views
urlpatterns = [
path('admin/', admin.site.urls),
path("classes/",views.classes),
]
Class.html代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>班级列表</title>
</head>
<body>
<h1>班级列表</h1>
<div><a href="/class_add/">添加</a></div>
<table border="1">
<thead>
<th>ID</th>
<th>班级名称</th>
<th>操作</th>
</thead>
<tbody>
{% for row in result %}
<tr>
<td>{
{ row.id }}</td>
<td>{
{ row.title }}</td>
<td>
<a>编辑</a>|
<a>删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
Views.py
from django.shortcuts import render,HttpResponse,redirect
from django.views.generic import View
import pymysql
def classes(request):
conn=pymysql.connect(
host="127.0.0.1",
port=3306,
user="root",
password="123456",
database="classes",
charset="utf8"
)
cursor = conn.cursor() # 出现前端网页拿不到数据,因为元组传不过去
# cursor = conn.cursor(pymysql.cursors.DictCursor)
sql="select * from class"
cursor.execute(sql,())
result=cursor.fetchall()
print(result)
return render(request,"classes.html",{
"result":result})
1.使用cursor = conn.cursor(pymysql.cursors.DictCursor)代码
result里面的数据:字典
页面显示:
2.cursor = conn.cursor() # 出现前端网页拿不到数据,因为元组传不过去
Result里面的结果:元组
页面显示:
第二节:添加班级
1.创建数据库帮助类:
因为数据库操作要用的地方比较多,所以创建一个工具包utils,在里面创建一个sqlhelper.py的数据库工具文件。
Sqlhelper.py
import pymysql
class SqlHelper():
def __init__(self):
self.connet()
def connet(self):
self.conn=pymysql.connect(
host="127.0.0.1",
port=3306,
user="root",
password="123456",
database="classes",
charset="utf8")
self.cursor = self.conn.cursor(pymysql.cursors.DictCursor)
def get_list(self,sql,args):
self.cursor.execute(sql, args)
result = self.cursor.fetchall()
return result
def close(self):
self.cursor()
self.conn.close()
使用工具类:
from apps.utils.sqlhelper import SqlHelper # 导入数据库帮助类
def classes(request):
obj=SqlHelper()
sql = "select * from class"
result = obj.get_list(sql,())
obj.close()
return render(request,"classes.html",{
"result":result})
使用上面代码的效果和原来是一样的。
2.添加班级:
Calss_add.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>添加班级</title>
</head>
<body>
<h1>添加班级</h1>
<form method="post" action="/class_add/">
<p><input type="text" name="title" placeholder="班级名称"></p>
<p><input type="submit" value="添加"></p>
</form>
</body>
</html>
Views.py
def class_add(request):
if request.method=="GET":
return render(request,"class_add.html")
else:
title = request.POST.get("title")
print(title)
obj=SqlHelper()
sql="insert into class(title) values(%s)"
obj.modify(sql,title)
obj.close()
return redirect("/classes/")
Sqlhelper.py
def modify(self,sql,args):
self.cursor.execute(sql,args)
self.conn.commit()
3.删除班级:
Classes.html
<a href="/class_del?cid={
{ row.id }}">删除</a>
Views.py
def class_del(request):
cid = request.GET.get("cid")
sql="delete from class where id=%s"
obj = SqlHelper()
obj.modify(sql,cid)
obj.close()
return redirect("/classes/")
4.编辑班级:
Classes.html
<a href =/class_edit?cid={
{ row.id }}> 编辑</a>|
Class_edit.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>编辑班级</title>
</head>
<body>
<form method="post" action="/class_edit/">
<p><input type="text" value="{
{ id }}" name="cid" ></p>
<p><input type="text" name="title" value="{
{ title }}"></p>
<p><input type="submit" value="更新"></p>
</form>
</body>
</html>
Views.py
def class_edit(request):
if request.method=="GET":
cid = request.GET.get("cid")
obj = SqlHelper()
sql="select * from class where id=%s"
result = obj.get_one(sql,cid)
obj.close()
return render(request,"class_edit.html",result)
else:
cid = request.POST.get("cid")
title=request.POST.get("title")
print(cid,title)
obj=SqlHelper()
sql="update class set title=%s where id=%s"
obj.modify(sql,(title,cid))
return redirect("/classes/")
sqlHelper.py
def get_one(self,sql,args):
self.cursor.execute(sql, args)
result = self.cursor.fetchone()
return result
演示:
第二节:分包管理
1.创建app
1.创建一个apps的包(原来的不要了,代码还是需要,本来那个apps按理要设置为classes的)
2.配置路由
4.将前面写的路由地址同一加上/classes/
<a href =/classes/class_edit?cid={
{ row.id }}> 编辑</a>|
<a href="/classes/class_del?cid={
{ row.id }}">删除</a>
<form method="post" action="/classes/class_add/">
等等。。。。
通过上面的路由配置管理,其实是分了两层,最外层是:和项目同名下面的urls文件里的路由;里层是:相应app下的,自己手动添加的urls路由文件。
当前端访问时,首先进入最外层的路由,然后根据配置分配到不同的app文件下的urls路由文件中,从而找到处理函数。
第三节:反向解析
在urls.py 文件中,在进行url映射时,为请求的url命名,以便在模板页面或者views.py视图中可以进行反向解析,同时在修改了url映射的请求路径,名称不变的情况下,不再修改模板页面或者视图中的数据,项目不受影响正常执行! url标签中使用模板变量和普通标签参数一样,空格隔开,{ {% url 别名 %}}
即可。
使用反向解析:
前端:
<div><a href="{% url 'classes:class_add' %}">添加</a></div>
<a href ="{% url 'classes:class_edit' %}?cid={
{ row.id }}"> 编辑</a>|
<a href="{% url 'classes:class_del' %}?cid={
{ row.id }}">删除</a>
后端:
return redirect("classes:classes")
补充:使用static下面的内容配置
当我们在项目下面创建一个static文件夹,里面放置一些静态文件,需要在setting.py里面配置如下:
<body>
<img src="/static/1.png">
</body>
其他表的操作都差不多,到这里Django基本有所了解了。
本文同步分享在 博客“战 胜”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。