在说明django模型之前,首先来说明一下django的生命周期,也就是一个请求到达django是如何处理的。【暂时不包含中间件】

浏览器的请求---->到达django中的urls中找到对应的映射------>到达视图层(返回的是html页面,html页面来自模板(templates)中的前端文件)---->前端中若是有数据需要来自后端的服务器,则需要模型(model),数据处理完毕之后通过return函数返回给客户端。【不太准确,一个简单的mvc模型】

通过以上描述,我们知道,模型的主要作用就是用来和后端交互。django是用python写的,因此在交互时可以使用python的orm(对象关系映射)来完成操作,但是django自带的model已经非常完善了,因此我们不需要在使用其他的orm。

为了更直观的显示model的作用,首先我们使用python的orm来完成一个前后端交互的实例。

测试环境: python2.6, django1.10.8

在python3中需要使用pymysql代替MySQldb.

基于前端的显示(前端代码如下),我们需要创建如下的表,可以使用python的MySQLdb连接mysql服务器使用orm映射创建,但是这里为了方便直接在MySQL上创建,如下:

这里的html代码和css代码分开了写,需要在html中引入css代码!

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
<link rel="stylesheet" type="text/css" href="/static/main_page.css">
</head>
<body>
<div class="out-border">
<div class="meg1">
<span class="sp1">留言板</span>
</div>
<form action="/main/" method="post">
<div class="itemc">
<span class="left_content">
<b class="star">*</b>
用户名
</span >
<input type="text" name="user" class="user_meta">
</div>
<div class="itemc">
<span class="left_content">
<b class="star">*</b>
密码
</span>
<input type="password" name="pwd" class="user_meta">
</div >
<div class="itemc">
<span class="left_content">
<b class="star">*</b>
邮箱
</span>
<input type="email" name="email" class="user_meta">
</div>
<div class="itemc">
<span class="left_content">
<b class="star">*</b>
留言
</span>
<!-- textarea两个标签不要有空格,不然光标不会放到第一个位置-->
<textarea name="message" id="Message" cols="" rows=""></textarea>
</div>
<input type="submit" class="betn_megSubmit" value="提交留言">
{% csrf_token %}
</form>
</div>
</body>
</html>

main.html

.out-border{
width: 500px;
height: 500px;
margin-top: 50px;
margin-left: %;
border: solid #faf8f9 1px;
border-radius: 5px;
}
.meg1{
background-color: #fa6104;
height: 60px;
border-radius: 5px;
}
.sp1{
float: left;
color: whitesmoke;
margin-top: 13px;
font-size: 25px;
margin-left: 213px;
letter-spacing: 10px;
}
.user_meta{
border-radius: 5px;
background-color: #faf8f9;
padding: 5px;
width: 202px;
font-size: 14px;
}
.star{
color: #dd2218;
}
.left_content{
display: block;
float: left;
width: 128px;
margin-right: 10px;
text-align: right;
line-height: 30px;
font-size: 16px;
color: #;
}
.itemc{
margin-top: 30px;
}
#Message{
font: 14px "Microsoft Yahei";
padding: 5px;
color: #;
resize: none;
height: 148px;
width: 300px;
border-radius: 5px;
background-color: #faf8f9;
}
.betn_megSubmit{
display: block;
width: 180px;
height: 40px;
border: 1px solid #fa6104;
background: #fa6104;
color: #fff;
border-radius: 5px;
line-height: 30px;
float: left;
font-size: 18px;
margin-left: 139px;
_margin-left: 37px;
margin-right: 30px;
cursor: pointer;
margin-top: 15px;
}

main_page.css

如果分开存放,需要在settings中引入静态文件目录:

STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),
)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
<style>
.out-border{
width: 500px;
height: 500px;
margin-top: 50px;
margin-left: %;
border: solid #faf8f9 1px;
border-radius: 5px;
}
.meg1{
background-color: #fa6104;
height: 60px;
border-radius: 5px;
}
.sp1{
float: left;
color: whitesmoke;
margin-top: 13px;
font-size: 25px;
margin-left: 213px;
letter-spacing: 10px;
font-family: Microsoft Yahei;
}
.user_meta{
border-radius: 5px;
background-color: #faf8f9;
padding: 5px;
width: 202px;
font-size: 14px;
}
.star{
color: #dd2218;
}
.left_content{
display: block;
float: left;
width: 128px;
margin-right: 10px;
text-align: right;
line-height: 30px;
font-size: 16px;
color: #;
}
.itemc{
margin-top: 30px;
}
#Message{
font: 14px "Microsoft Yahei";
padding: 5px;
color: #;
resize: none;
height: 148px;
width: 300px;
border-radius: 5px;
background-color: #faf8f9;
}
.betn_megSubmit{
display: block;
width: 180px;
height: 40px;
border: 1px solid #fa6104;
background: #fa6104;
color: #fff;
border-radius: 5px;
line-height: 30px;
float: left;
font-size: 18px;
margin-left: 139px;
_margin-left: 37px;
margin-right: 30px;
cursor: pointer;
margin-top: 15px;
}
</style>
</head>
<body>
<div class="out-border">
<div class="meg1">
<span class="sp1">留言板</span>
</div>
<form action="/hello/" method="post">
<div class="itemc">
<span class="left_content">
<b class="star">*</b>
用户名
</span >
<input type="text" name="user" class="user_meta">
</div>
<div class="itemc">
<span class="left_content">
<b class="star">*</b>
密码
</span>
<input type="password" name="pwd" class="user_meta">
</div >
<div class="itemc">
<span class="left_content">
<b class="star">*</b>
邮箱
</span>
<input type="email" name="email" class="user_meta">
</div>
<div class="itemc">
<span class="left_content">
<b class="star">*</b>
留言
</span>
<!-- textarea两个标签不要有空格,不然光标不会放到第一个位置-->
<textarea name="message" id="Message" cols="" rows=""></textarea>
</div>
<input type="submit" class="betn_megSubmit" value="提交留言">
<!-- {% csrf_token %} -->
</form>
</div>
</body>
</html>
MariaDB [mytest]> create table msgtb(name varchar(), pwd varchar(), email varchar(), msg varchar());
Query OK, rows affected (0.03 sec) MariaDB [mytest]> desc msgtb;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| name | varchar() | YES | | NULL | |
| pwd | varchar() | YES | | NULL | |
| email | varchar() | YES | | NULL | |
| msg | varchar() | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
rows in set (0.01 sec) MariaDB [mytest]>

建表语句

下面要做的就是把通过前端页面填写的信息,保存到数据库中。

因为要使用python的第三方orm映射,因此首先在django的工程目录下面,创建如下py文件!

这个文件主要作用是对MySQLdb进行封装,以方便调用接口直接查询,插入数据。

# *-* coding:utf- *-*
# Auth: wangxz import MySQLdb class DbConn(object):
def __init__(self, host, user, port, pwd, dbname):
self.__host = host
self.__user = user
self.__port = port
self.__pwd = pwd
self.__dbname = dbname
self.__db_obj = MySQLdb.connect(
host=self.__host,
user=self.__user,
port=self.__port,
passwd=self.__pwd,
db=self.__dbname
) # 调用的时候,传递的参数是查询语句,返回的第一条数据
def query(self, querys, str1):
cursor = self.__db_obj.cursor()
cursor.execute(querys, str1)
result = cursor.fetchone()
return result # 返回所有的数据
def query_all(self, querys):
cursor = self.__db_obj.cursor()
cursor.execute(querys)
result = cursor.fetchall()
return result # 调用的时候,传递的参数是插入语句
def insert_data(self, data, args):
cursor = self.__db_obj.cursor()
cursor.execute(data, args)
self.__db_obj.commit() if __name__ == "__main__":
DB_msg = {
"host": "10.0.102.204",
"user": "root",
"port": ,
"pwd": "",
"dbname": "mytest",
} db1 = DbConn(**DB_msg)
sqls = "select * from mytest where name=%s and pwd=%s"
str1 = ["wxz", ""]
data = db1.query(sqls, str1)
print(data)

DBAction.py

视图文件views.py如下:

# *-* coding:utf- *-*
from django.shortcuts import HttpResponse
from django.shortcuts import render # Create your views here.
from DBAction import DbConn DB_msg = {
"host": "10.0.102.204",
"user": "root",
"port": ,
"pwd": "",
"dbname": "mytest",
}
db_obj = DbConn(**DB_msg) def main(request):
if request.method == "GET":
return render(request, "main.html")
elif request.method == "POST":
username = request.POST.get("user")
pwd = request.POST.get("pwd")
email = request.POST.get("email")
msg = request.POST.get("message")
insert_msg = (username, pwd, email, msg)
insert_sql = "insert into msgtb(name, pwd, email, msg) values(%s, %s, %s, %s)"
db_obj.insert_data(insert_sql, insert_msg)
select_sql = "select * from msgtb"
select_data = db_obj.query_all(select_sql)
print "The query result is:", select_data
return HttpResponse("What a fuck!") #需要说明的是这个文件没有后端展示功能,借助了查询接口,直接把数据库中的数据打印了出来。

在urls中加入对应的映射:

from mysite.views import main

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^main/', main),
]

运行这个文件,在前端填写数据,提交信息,会跳转到“what a fuck”的页面。并且在pycharm中会有如下输出:

[/Jan/ ::] "GET /main/ HTTP/1.1"  1745 

#查询出来的结果
The query result is: (('wangxz', '1234qwer', '234234@qq.com', 'God is a girl!'), ('wangxz', '1234qwer', '10549@qq.com', 'what a fuck!!'), ('wangxz', '
1234qwer', '@qq.com', 'what a fuck!!'))
[/Jan/ ::] "POST /main/ HTTP/1.1"

以上一个简单的实例,来说明了model层的作用。上面的实例可以知道,如果使用python第三方的orm,需要自己写sql语句,自己对字段的条件进行约束,这些对开发来说都是额外的工作,因此django提供了model模块,来完成的这些操作,开发者不需要关注sql语句的实现,只需要关注逻辑层的应用即可!

来总结一下,创建一个简单django工程的步骤:

  1. 首先创建django工程文件,可以使用pycharm工具直接创建。
  2. 创建对应的app应用,注意app名称需要在settings.py中注册。python manage.py startapp appname
  3. 如果使用pycharm创建那么templates文件就会直接写到settings.py中,否则需要手动加入。
  4. 如果使用css和js文件,需要创建static目录,目录仍然需要在settings.py中注册。
  5. 写url映射,写视图文件,视图文件需要调用前端代码,前端代码存在templates目录中,前端代码的格式文件存在static目录中。
  6. 视图文件中还涉及与后端的交互操作,而后端数据库的定义需要在models.py中指定
  7. 若是使用了django自带的orm(推荐使用自带的orm),还需要使用python manage.py makemigrations, python manage.py migrate来生成对应的数据库及表。

一些注册操作:

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
"mysite", #自己创建的app写在这里,注意格式
]

app应用注册

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
........ #找到对应的templatees写入第二行,

templates注册

STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),
)

static注册

目前整个django工程的目录结构如下:

django中的模型详解-1的更多相关文章

  1. django中models field详解

    本文参考自:django官方文档models/field 在model中添加字段的格式一般为:  field_name = field_type(**field_options) 一  field o ...

  2. django中request对象详解(转载)

    django中的request对象详解 Request 我们知道当URLconf文件匹配到用户输入的路径后,会调用对应的view函数,并将  HttpRequest对象  作为第一个参数传入该函数. ...

  3. Django中的Ajax详解

    AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当 ...

  4. django中的filter详解

    filter (数据过滤) 我们很少会一次性从数据库中取出所有的数据:通常都只针对一部分数据进行操作. 在Django API中,我们可以使用`` filter()`` 方法对数据进行过滤: > ...

  5. ThinkPHP中视图模型详解.

    很多TP的新手对于模型中的视图模型不甚了解,官方虽然有详细手册,但是对于初学者来说还是比较难以理解! 先简单说一下视图模型所能实现的功能,基本就是主表与副表之间各个字段的关联问题,实现多表关联查询,相 ...

  6. django中的auth详解

     Auth模块是什么 Auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等 ...

  7. Odoo中的模型详解

     转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826118.html   [Odoo中,一切皆模型,连视图都是模型.Odoo将各种数据,如:权限数据.类 ...

  8. Django中model层详解

    #!/usr/bin/env python# _*_ coding:utf-8 _*_ from django.db import models class UserType(models.Model ...

  9. ASP.NET Core的配置(2):配置模型详解

    在上面一章我们以实例演示的方式介绍了几种读取配置的几种方式,其中涉及到三个重要的对象,它们分别是承载结构化配置信息的Configuration,提供原始配置源数据的ConfigurationProvi ...

随机推荐

  1. 1: 创建一个sap demo项目:

    1:  创建一个项目:

  2. awk命令分析日志的简单笔记

    awk是一个文本分析工具,可以用来进行流量日志分析 之前无意中看到了这个命令,简单记一下笔记 ,在打线下的时候可能会有用 awk有3个不同版本: awk.nawk和gawk,未作特别说明,一般指gaw ...

  3. java中Long的比较

    Long的比较要用equals而不要用== 当Long为常量且常量值小于一个字节(<=127)时,两个Long指向同一个常量内容: Long userId=127L; Long authorId ...

  4. DAX/PowerBI系列 - 参数表(Parameter Table) - 大客户分析(Top N)

    DAX/PowerBI系列 - 参数表(Parameter Table) - 大客户分析(Top N) 难度: ★☆☆☆☆(1星) 适用范围: ★★★☆☆(3星) 概况:此文为DAX/PowerBI系 ...

  5. Python爬虫常用模块安装

    安装:pip3 install requestspip3 install seleniumpip3 install bs4pip3 install pyquerypip3 install pymysq ...

  6. [LeetCode] Backtracking Template for (Subsets, Permutations, and Combination Sum)

    根据issac3 用Java总结了backtracking template, 我用他的方法改成了Python. 以下为template. def backtrack(ans, temp, nums, ...

  7. selenium元素单击不稳定解决方法

    selenium自动化测试过程中,经常会发现某一元素单击,很不稳定,有时候执行了点击没有反映. 以下总结两种解决方法:都是通过js注入的方式去点击. 1.F12查一看,要点击的按钮,或连接,有没有on ...

  8. 一群猴子排成一圈,按1,2,...,n依次编号

    朋友面试遇到的题,网上大部分都是直接往数组后push的解法,不考虑,下面这个方法看起来很简单,但是我理解不了,有大牛懂得给解释一下 朋友面试遇到的题,网上大部分都是直接往数组后push的解法,不考虑, ...

  9. ecshop 前台个人中心修改侧边栏 和 侧边栏显示不全 或 导航现实不全

    怎么给个人中心侧边栏加项或者减项 在模板文件default/user_menu.lbi 文件里添加或者修改,一般看到页面都会知道怎么加,怎么删,这里就不啰嗦了 添加一个栏目以后,这个地址跳的页面怎么写 ...

  10. MyBatis基础入门《三》Select查询集合

    MyBatis基础入门<三>Select查询集合 描述: 代码新增了一个MybatisUtil工具类,查询数据库返回集合的时候,接收数据的三种方式.由于代码会渐渐增多,未涉及改动过的文件不 ...