Model操作(一)

一、Django ORM基本配置
ORM:关系对象映射(Object Relational Mapping,简称ORM)
db Frist:到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞:1.创建数据库,设计表结构和字段;2.使用 MySQLdb 来连接数据库,并编写数据访问层代码;3.业务逻辑层去调用数据访问层执行数据库操作.
Code Frist:根据代码中定义的类来自动生成数据库表.django遵循此类原则。

1、修改project数据库配置(程序主目录下的settings.py文件)

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}

#连接sqlite3(默认)

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'zyweb', #数据库名
'USER': 'root', #账号
'PASSWORD': 'zyw@123', #密码
'HOST': '192.168.28.129', #mysql数据库IP
'PORT': '', #对端端口
}
}
#注意:Django默认用的MysqlDB模块连接数据库,但在python3.x里面还没有这个模块,所有需要把连接数据库的模块改成pymsyql,修改project目录下的init.py文件
import pymysql
pymysql.install_as_MySQLdb()

#连接MySQL

2、创建定义数据库表结构文件(对应app目录下的models.py文件)

from django.db import models

# Create your models here.

class UserInfo(models.Model):
# 创建的表名名称为cmdb_userinfo
# 数据库默认创建id列 自增 主键
# 用户名列 字符串类型 字符长度
username = models.CharField(max_length=32) # max_length 字符长度
passwd = models.CharField(max_length=64)

#生成一个简单的数据库表:

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'cmdb', # 系统会加载cmdb下的model.py文件
]

把对应的app名称加入到settings.py文件配置里:

3、生成数据库表

python manage.py makemigrations
python manage.py migrate # 生成数据表

查看数据库表详情(建议用可视化工具:Navicat)

4、数据库字段

1、models.AutoField  自增列 = int(11)
  如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。
2、models.CharField  字符串字段
  必须 max_length 参数
3、models.BooleanField  布尔类型=tinyint(1)
  不能为空,Blank=True
4、models.ComaSeparatedIntegerField  用逗号分割的数字=varchar
  继承CharField,所以必须 max_lenght 参数
5、models.DateField  日期类型 date
  对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。
6、models.DateTimeField  日期类型 datetime
  同DateField的参数
7、models.Decimal  十进制小数类型 = decimal
  必须指定整数位max_digits和小数位decimal_places
8、models.EmailField  字符串类型(正则表达式邮箱) =varchar
  对字符串进行正则表达式
9、models.FloatField  浮点类型 = double
10、models.IntegerField  整形
11、models.BigIntegerField  长整形
  integer_field_ranges = {
    'SmallIntegerField': (-32768, 32767),
    'IntegerField': (-2147483648, 2147483647),
    'BigIntegerField': (-9223372036854775808, 9223372036854775807),
    'PositiveSmallIntegerField': (0, 32767),
    'PositiveIntegerField': (0, 2147483647),
  }
12、!models.IPAddressField  字符串类型(ip4正则表达式)不再使用
13、models.GenericIPAddressField  字符串类型(ip4和ip6是可选的)
  参数protocol可以是:both、ipv4、ipv6
  验证时,会根据设置报错
14、models.NullBooleanField  允许为空的布尔类型
15、models.PositiveIntegerFiel  正Integer
16、models.PositiveSmallIntegerField  正smallInteger
17、models.SlugField  减号、下划线、字母、数字
18、models.SmallIntegerField  数字
  数据库中的字段有:tinyint、smallint、int、bigint
19、models.TextField  字符串=longtext
20、models.TimeField  时间 HH:MM[:ss[.uuuuuu]]
21、models.URLField  字符串,地址正则表达式
22、models.BinaryField  二进制
23、models.ImageField 图片
24、models.FilePathField 文件

#字段

5、数据库字段参数

 null               -> db是否可以为空
default -> 默认值
primary_key -> 主键
db_column -> 列名
db_index -> 索引
unique -> 唯一索引
unique_for_date ->
unique_for_month
unique_for_year
auto_now -> 更新时,自动更新为当前时间
auto_now_add -> 创建时,自动生成时间
choices -> django admin中显示下拉框,避免连表查询
blank -> django admin是否可以为空
verbose_name -> django admin显示字段中文
editable -> django admin是否可以被编辑
error_messages -> 错误信息欠
help_text -> django admin提示
validators -> django
form, 自定义错误信息(欠)

#字段参数

6、DateTimeField 时区问题解决

TIME_ZONE = 'Asia/Shanghai'

USE_TZ = False

二、数据库操作(基本)
1、增加数据
  ① 第一种方式(最常用)

from cmdb import models
def ormadd(request):
models.UserInfo.objects.create(username="James",passwd="") return HttpResponse("ormadd")

  ② 第一种方式的另一种写法

from cmdb import models
def ormadd(request):
dicts = {'username':"James",'passwd':""}
models.UserInfo.objects.create(**dicts) return HttpResponse("ormadd")

  ③ 第二种方式

from cmdb import models
def ormadd(request):
obj = models.UserInfo(username='root',passwd='')
obj.save() return HttpResponse("ormadd")

2、查询数据 
  ① 查询所有

from cmdb import models
def ormselect(request):
result = models.UserInfo.objects.all()
print(result) # QuerySet类型 列表里每个元素都是一个obj对象
# <QuerySet [<UserInfo: UserInfo object>, <UserInfo: UserInfo object>, <UserInfo: UserInfo object>]>
for row in result:
print(row.id,row.username,row.passwd)
# 1 James 8888
# 2 root 123
# 3 James 8888
return HttpResponse("ormselect")

  ② 查找指定字段

from cmdb import models
def ormselect(request):
result = models.UserInfo.objects.filter(username='root') # filter()里可以用,分开 表示and
if result:
for row in result:
print(row.id,row.username,row.passwd)
# 2 root 123 return HttpResponse("ormselect")

  ③ 获取查询第一条数据和统计匹配个数

from cmdb import models
def ormselect(request):
obj = models.UserInfo.objects.filter(username='root').filter() # 获取匹配的第一条字段
c = models.UserInfo.objects.filter(username='root').count() # 获取匹配的字段个数 return HttpResponse("ormselect")

  ④ 比较值查询以及多条件查询

models.User.objects.filter(id=1,name='root')        # id等于1或者name等于root
models.User.objects.filter(id__gt=1,name='root') # id大于1
models.User.objects.filter(id__lt=1) # id小于1
models.User.objects.filter(id__gte=1) # id大等于
models.User.objects.filter(id__lte=1) # id小等于

  ⑤ 指定查询数据库某个字段的所有数据

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>项目组(对象) v1</p>
<ul>
{% for row in v1 %}
<li>{{ row.id }}-{{ row.caption }}-{{ row.code }}</li>
{% endfor %}
</ul>
<p>项目组(字典) v2</p>
<ul>
{% for row in v2 %}
<li>{{ row.id }}-{{ row.caption }}</li>
{% endfor %}
</ul>
<p>项目组(元组) v3</p>
<ul>
{% for row in v3 %}
<li>{{ row.0 }}-{{ row.1 }}</li>
{% endfor %}
</ul>
</body>
</html>

business.html

def business(request):
v1 = models.Business.objects.all()
print("v1",v1)
# v1 < QuerySet[ < Business: Business object >, < Business: Business object >,
# < Business: Business object >, < Business: Business object >] > v2 = models.Business.objects.all().values("id","caption")
print("v2",v2)
# v2 < QuerySet[{'caption': '运维', 'id': 1}, {'caption': '开发', 'id': 2}, {'caption': '销售', 'id': 3},
# {'caption': '市场', 'id': 4}] > v3 = models.Business.objects.all().values_list("id","caption")
print("v3",v3)
# v3 < QuerySet[(1, '运维'), (2, '开发'), (3, '销售'), (4, '市场')] > return render(request,'business.html',{'v1':v1,'v2':v2,'v3':v3}) #注:values和values_list后不指定字段的话,获取的是所有的字段数据

获取表单数据

3、删除数据 
  ① 删除指定字段

from cmdb import models
def ormdel(request):
models.UserInfo.objects.filter(id=3).delete() return HttpResponse("ormdel")

4、更新数据 
  ① 更新指定字段

from cmdb import models
def ormupdate(request):
models.UserInfo.objects.filter(id=2).update(passwd='') return HttpResponse("ormupdate")

  ② 更新所有数据字段

from cmdb import models
def ormupdate(request):
models.UserInfo.objects.all().update(passwd='') return HttpResponse("ormupdate")

三、数据库操作(一对多)
1、数据库表结构

from django.db import models

# Create your models here.

class UserInfo(models.Model):
# 创建的表名名称为cmdb_userinfo
username = models.CharField(max_length=32)
passwd = models.CharField(max_length=64)
# 关联外键 生成字段名为user_group_id
user_group = models.ForeignKey("UserGroup",to_field='uid',default=1) #关联usergroup表的uid字段默认为1 class UserGroup(models.Model):
# 创建的表名名称为cmdb_usergroup
uid = models.AutoField(primary_key=True) #主键 自增
caption = models.CharField(max_length=32,unique=True) #唯一索引
ctime = models.DateField(auto_now_add=True,null=True) #创建时生成时间
uptime = models.DateField(auto_now=True,null=True) #更新是自动更新时间

2、外键关联添加数据

from cmdb import models
def add(request):
ug_obj = models.UserGroup.objects.create(caption='外键数据添加') #把外键obj直接当参数传入
models.UserInfo.objects.create(username='James',passwd='',user_group=ug_obj) return HttpResponse('OK')

3、外键关联表操作

from cmdb import models
def ormadd(request):
models.UserInfo.objects.create(username="James",passwd="")
return HttpResponse("ormadd")
def ormgroup(request):
models.UserGroup.objects.create(caption="CEO")
return HttpResponse("ormgroup") def userinfo(request):
obj = models.UserInfo.objects.all().first()
# user_group_id 指定的是userinfo表里存的id号
print(obj.id,obj.username,obj.user_group_id)
# 1 James 1 # user_group 指定的是用户组obj对象
print(obj.user_group.uid,obj.user_group.caption)
# 1 CEO
return HttpResponse("userinfo")

4、跨表查询,神奇的双下划线__

class Business(models.Model):
# id
caption = models.CharField(max_length=32)
code = models.CharField(max_length=32,null=True,default="SA") class Host(models.Model):
nid = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=32,db_index=True)
ip = models.GenericIPAddressField(protocol="ipv4",db_index=True)
port = models.IntegerField()
b = models.ForeignKey(to="Business", to_field='id')

models.py

def home(request):
# b__capiton 通过双下划线直接跨表获取对应caption的数据
v2 = models.Host.objects.filter(nid__gt=0).values('nid','hostname','b_id','b__caption')
# < QuerySet[{'nid': 2, 'b__caption': '开发', 'hostname': '系统1', 'b_id': 2},
# {'nid': 3, 'b__caption': '销售','hostname': '系统2', 'b_id': 3}> return render(request, 'home.html')

获取表单数据

5、**反向跨表查询

from django.db import models

# Create your models here.

class UserType(models.Model):
name = models.CharField(max_length=32) class User(models.Model):
name = models.CharField(max_length=32)
pwd = models.CharField(max_length=32) u_type = models.ForeignKey(to="UserType", to_field='id')

models.py

  ① 从对象中取值user_set

from app01 import models
def index(request):
obj = models.UserType.objects.filter(id=1)
for item in obj:
print(item.id,item.name)
print(item.user_set) # 指定关联表类名
print(item.user_set.all())
print(item.user_set.values('name','pwd')) #1 技术部
#app01.User.None
#<QuerySet [<User: User object>, <User: User object>, <User: User object>]>
#<QuerySet [{'name': 'lzl5', 'pwd': '123456'}, {'name': 'lzl1', 'pwd': '123456'}, {'name': 'lzl2', 'pwd': '123456'}]> return HttpResponse('OK')

  ② 双下划线查询取值user__ 

# 反向查询
from app01 import models
def index(request):
obj = models.UserType.objects.all().values('name','user__name')
print(obj)
# < QuerySet[{'name': '技术部', 'user__name': 'lzl5'}, {'name': '技术部', 'user__name': 'lzl1'},
# {'name': '技术部','user__name': 'lzl2'}]> return HttpResponse('OK')
related_name=None,          # 反向操作时,使用的字段名,用于代替 【表名_set】 如: obj.表名_set.all()
related_query_name=None, # 反向操作时,使用的连接前缀,用于替换【表名】 如: models.UserGroup.objects.filter(表名__字段名=1).values('表名__字段名')

涉及到的参数

四、数据库操作(多对多)
1、自定义创建关系表

class Host(models.Model):
nid = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=32,db_index=True)
ip = models.GenericIPAddressField(protocol="ipv4",db_index=True)
port = models.IntegerField()
b = models.ForeignKey(to="Business", to_field='id') # 这里先忽略 class Applications(models.Model):
name = models.CharField(max_length=32) class HostToAPP(models.Model):
# 可以自定义多种字段
hobj = models.ForeignKey(to='Host',to_field='nid')
aobj = models.ForeignKey(to='Applications',to_field='id')
HostToAPP.objects.create(hobj_id=1,aobj_id=2)

创建数据

2、自动创建关系表

class Host(models.Model):
nid = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=32,db_index=True)
ip = models.GenericIPAddressField(protocol="ipv4",db_index=True)
port = models.IntegerField()
b = models.ForeignKey(to="Business", to_field='id') # 这里先忽略 class Applications(models.Model):
name = models.CharField(max_length=32) r = models.ManyToManyField("Host")

#自动生成第三张关联表cmdb_applications_r;下面我们就来看看针对这种情况下,如何对表进行操作

  ① 增加

# 第三张表增加
obj = models.Application.objects.get(id=1) obj.r.add(1) # 创建id=1,nid=1
obj.r.add(2) # 创建id=1,nid=2
obj.r.add(2, 3, 4) # 创建id=1,nid=2、id=1,nid=3 、id=1,nid=4
obj.r.add(*[1, 2, 3, 4]) # 同上

  ② 删除

# 第三张表删除
obj = models.Application.objects.get(id=1) obj.r.remove(1) # 删除id=1,nid=1
obj.r.remove(2,4) # 删除id=1,nid=2、id=1,nid=4
obj.r.remove(*[1,2,3]) # 批量删 obj.r.clear() # 所有id=1的关系删除

  ③ 更新

# 第三张表更新
obj = models.Application.objects.get(id=1) obj.r.set([3,5,7]) # 清空原来的id=1关系,创建id=1,nid=3;id=1,nid=5;id=3,nid=7
# 等同于执行obj.r.clear()再执行obj.r.add(*[3,5,7])

  ④ 查询

# 第三张表查询
obj = models.Application.objects.get(id=1) # 所有相关的主机对象“列表” QuerySet
obj.r.all() # 所有对应的Host对象

 数据库练习示例 

主project项目路由关系:

from django.conf.urls import url,include
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^cmdb/', include("app01.urls")), #(多级路由)调整到app01目录中的urls.py文件;注意include的是字符串形式的文件路径
#url(r'^monitor/', include("app02.urls")),
]

urls.py

app01下的文件:

from django.db import models
# Create your models here. class UserGroup(models.Model):
uid = models.AutoField(primary_key=True)
caption = models.CharField(max_length=32)
ctime = models.DateTimeField(auto_now_add=True, null=True)
uptime = models.DateTimeField(auto_now=True, null=True)
class UserInfo(models.Model):
# 创建的表名名称为cmdb_userinfo
# 数据库默认创建id列 自增 主键
# 用户名列 字符串类型 字符长度
username = models.CharField(max_length=32) # max_length 字符长度
password = models.CharField(max_length=64)
email = models.CharField(max_length=60)
test = models.EmailField(max_length=19,null=True,error_messages={'invalid': '请输入密码'})
# user_group_id 数字
user_group = models.ForeignKey("UserGroup",to_field='uid') # (uid,catption,ctime,uptimew)
user_type_choices = (
(1, '超级用户'),
(2, '普通用户'),
(3, '普普通用户'),
)
user_type_id = models.IntegerField(choices=user_type_choices,default=1)

models.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# _author_soloLi
from django.conf.urls import url,include
from django.contrib import admin
from app01 import views urlpatterns = [
url(r'^orm/', views.orm),
url(r'^login/', views.login),
url(r'^index/', views.index),
url(r'^user_info/', views.user_info),
url(r'^userdetail-(?P<nid>\d+)/', views.user_detail),
url(r'^userdel-(?P<nid>\d+)/', views.user_del),
url(r'^useredit-(?P<nid>\d+)/', views.user_edit),
]

urls.py

from django.shortcuts import HttpResponse
from django.shortcuts import render
from django.shortcuts import redirect # Create your views here.
# USER_DICT = {
# '1':{'name':'root1','email':'root@live.com'},
# '2':{'name':'root2','email':'root@live.com'},
# '3':{'name':'root3','email':'root@live.com'},
# '4':{'name':'root4','email':'root@live.com'},
# }
def login(request):
#登录
#业务逻辑:
#1、如果用get方法(即输入url方式)-->访问登录页面(login.html)
#2、如果用post方法(即点击页面提交方式)-->判断提交的数据是否为存在的用户名、密码
# --①获取用户用post方法提交的数据(用户名、密码)
# --②把获取到的用户名和密码 与 数据库中存在的用户名密码进行对比
# --1.如果匹配成功 -->跳转到/cmdb/index页面
# --2.如果不匹配成功-->提示错误警告、重新跳转到登录页面(login.html)
#3、如果用PUT,DELETE,HEAD,OPTION...等方法-->访问/index/页面
models.UserGroup.objects.create(caption='DBA')
error_msg=''
if request.method == "GET":
return render(request, 'login.html')
elif request.method == "POST":
u = request.POST.get('user')
p = request.POST.get('pwd')
obj = models.UserInfo.objects.filter(username=u, password=p).first() #拿数据库中对象进行匹配(匹配+获取对象数据)//拿数据库中对象个数进行匹配(只能达到匹配效果,获取不到对象信息)
if obj:
return redirect('/cmdb/index/')
else:
error_msg = '煞笔! 忘记用户名密码了吧!'
return render(request, 'login.html',{'error_msg':error_msg})
else:
return redirect('/index/') def index(request):
return render(request, 'index.html') def user_info(request):
#用户信息
#业务逻辑:
#1、如果用get方法(即输入url方式)-->获取数据库中所有用户信息,并访问用户信息页面进行展示(user_info.html)
#2、如果用post方法(即点击页面提交方式<添加按钮>)-->把新的用户名、密码写入数据库
# --①获取添加的用户名、密码
# --②在数据库中写入添加的用户名、密码
# --③跳转到用户信息页面(/cmdb/user_info/)(访问的新的用户信息页面,相当于刷新页面,把最新的数据库信息展示出来) if request.method == "GET":
user_list = models.UserInfo.objects.all() #user_list为QuerySet类型
group_list = models.UserGroup.objects.all()
return render(request, 'user_info.html', {'user_list': user_list, "group_list": group_list})
elif request.method == 'POST':
u = request.POST.get('user')
p = request.POST.get('pwd')
models.UserInfo.objects.create(username=u,password=p)
return redirect('/cmdb/user_info/') def user_detail(request, nid):
#用户详细信息
#业务逻辑:
#1、根据id获取数据库中一个对象的信息,并跳转到用户详细信息页面进行展示(user_detail.html) # models.UserInfo.objects.get(id=nid) # 取单条数据,如果不存在,直接报错
obj = models.UserInfo.objects.filter(id=nid).first()
return render(request, 'user_detail.html', {'obj': obj}) def user_del(request, nid):
#删除用户信息
#业务逻辑:
#根据id删除数据库中一个对象的信息,并跳转到用户信息页面(/cmdb/user_info/)(访问的新的用户信息页面,相当于刷新页面,把最新的数据库信息展示出来) models.UserInfo.objects.filter(id=nid).delete()
return redirect('/cmdb/user_info/') def user_edit(request, nid):
#编辑用户信息
#业务逻辑:
#1、如果用get方法(即输入url方式)-->获取数据库中一个用户信息,并访问用户详细信息页面进行展示(user_edit.html)
#2、如果用post方法(即点击页面提交方式<编辑按钮>)-->把编辑的最新的用户名、密码写入数据库,并展示
# --①获取编辑的信息:id、用户名、密码
# --②通过id在数据库中更新用户名、密码
# --③跳转到用户信息页面(/cmdb/user_info/)(访问的新的用户信息页面,相当于刷新页面,把最新的数据库信息展示出来)
if request.method == "GET":
obj = models.UserInfo.objects.filter(id=nid).first()
return render(request, 'user_edit.html',{'obj': obj})
elif request.method == "POST":
nid = request.POST.get('id')
u = request.POST.get('username')
p = request.POST.get('password')
models.UserInfo.objects.filter(id=nid).update(username=u,password=p)
return redirect('/cmdb/user_info/') from app01 import models
def orm(request):
# models.UserInfo.objects.create(username="solo",password="1024")
# models.UserInfo.objects.create(username="daly",password="6969") models.UserInfo.objects.create(
username='dagaoge',
password='',
email="1195619314@qq.com",
test="fuck daly",
user_group_id = 1
) return HttpResponse("orm")

views.py

templates下的html模板:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
body{
margin: 0;
}
.menu{
display: block;
padding: 5px; }
</style>
</head>
<body>
<div style="height: 48px;background-color: black;color: white">
第一个Django小程序
</div>
<div>
<div style="position: absolute;top:48px;bottom: 0;left: 0;width: 200px;background-color: brown;">
<a class="menu" href="/cmdb/user_info/">用户管理</a>
<a class="menu" href="/cmdb/user_group/">用户组管理</a>
</div>
<div style="position:absolute;top:48px;left: 210px;bottom: 0;right: 0;overflow: auto"> <h3>添加用户</h3>
<form method="POST" action="/cmdb/user_info/">
<input type="text" name="user" />
<input type="text" name="pwd" /> <select name="group_id">
{% for item in group_list %}
<option value="{{ item.uid }}">{{ item.caption }}</option>
{% endfor %}
</select> <input type="submit" value="添加"/>
</form> <h3>用户列表</h3>
<ul>
{% for row in user_list %}
<li>
<a href="/cmdb/userdetail-{{ row.id }}/">{{ row.username }}</a> |
<span> {{ row.user_group.caption }} </span>
<a href="/cmdb/userdel-{{ row.id }}/">删除</a> |
<a href="/cmdb/useredit-{{ row.id }}/">编辑</a>
</li>
{% endfor %}
</ul> </div> </div> </body>
</html>

user_info.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
body{
margin: 0;
}
.menu{
display: block;
padding: 5px; }
</style>
</head>
<body>
<div style="height: 48px;background-color: black;color: white">
第一个Django小程序
</div>
<div>
<div style="position: absolute;top:48px;bottom: 0;left: 0;width: 200px;background-color: brown;">
<a class="menu" href="/cmdb/user_info/">用户管理</a>
<a class="menu" href="/cmdb/user_group/">用户组管理</a>
</div>
<div style="position:absolute;top:48px;left: 210px;bottom: 0;right: 0;overflow: auto"> <h1>用户详细信息</h1> {# 根据获取的obj对象再获取相关信息(id、name、password) #} <h5>{{ obj.id }}</h5>
<h5>{{ obj.name }}</h5>
<h5>{{ obj.password }}</h5> </div> </div> </body>
</html>

user_detail.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
body{
margin: 0;
}
.menu{
display: block;
padding: 5px; }
</style>
</head>
<body>
<div style="height: 48px;background-color: black;color: white">
第一个Django小程序
</div>
<div>
<div style="position: absolute;top:48px;bottom: 0;left: 0;width: 200px;background-color: brown;">
<a class="menu" href="/cmdb/user_info/">用户管理</a>
<a class="menu" href="/cmdb/user_group/">用户组管理</a>
</div>
<div style="position:absolute;top:48px;left: 210px;bottom: 0;right: 0;overflow: auto"> <h1>编辑用户</h1> {# 根据获取的obj对象再获取相关信息(id、name、password) #}
<form method="post" action="/cmdb/useredit-{{ obj.id }}/">
<input style="display: none" type="text" name="id" value="{{ obj.id }}" />
<input type="text" name="username" value="{{ obj.username }}" />
<input type="text" name="password" value="{{ obj.password }}"/>
<input type="submit" value="提交" />
</form> </div> </div> </body>
</html>

user_edit.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
body{
margin: 0;
}
.menu{
display: block;
padding: 5px;
}
</style>
</head> <body>
<div style="height: 48px;background-color: black;color: white">
第一个Django小程序
</div>
<div>
<div style="position: absolute;top:48px;bottom: 0;left: 0;width: 200px;background-color: brown;">
<a class="menu" href="/cmdb/user_info/">用户管理</a>
<a class="menu" href="/cmdb/user_group/">用户组管理</a>
</div>
</div> </body>
</html>

index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/cmdb/login/" method="POST" enctype="multipart/form-data">
<p>
<input type="text" name="user" placeholder="用户名" /> </p>
<p>
<input type="password" name="pwd" placeholder="密码" />
</p> <input type="submit" value="提交"/>
<span style="color: red;">{{ error_msg }}</span>
</form>
</body>
</html>

login.html

Python学习笔记整理总结【Django】:Model操作(一)的更多相关文章

  1. python学习笔记整理——字典

    python学习笔记整理 数据结构--字典 无序的 {键:值} 对集合 用于查询的方法 len(d) Return the number of items in the dictionary d. 返 ...

  2. Python学习笔记整理总结【Django】【MVC/MTV/路由分配系统(URL)/视图函数 (views)/表单交互】

     一.Web框架概述  Web框架本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env python # -*- coding:utf-8 ...

  3. python 学习笔记十六 django深入学习一 路由系统,模板,admin,数据库操作

    django 请求流程图 django 路由系统 在django中我们可以通过定义urls,让不同的url路由到不同的处理函数 from . import views urlpatterns = [ ...

  4. python 学习笔记十五 django基础

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...

  5. python学习笔记整理——集合 set

    python学习整理笔记--集合 set 集合的用途:成员测试和消除重复的条目,进行集合运算 注意:花括号或set()函数可以用于创建集合. 注意:若要创建一个空的集合你必须使用set(),不能用{} ...

  6. python学习笔记整理——列表

    Python 文档学习笔记 数据结构--列表 列表的方法 添加 list.append(x) 添加元素 添加一个元素到列表的末尾:相当于a[len(a):] = [x] list.extend(L) ...

  7. python学习笔记整理——元组tuple

    Python 文档学习笔记2 数据结构--元组和序列 元组 元组在输出时总是有括号的 元组输入时可能没有括号 元组是不可变的 通过分拆(参阅本节后面的内容)或索引访问(如果是namedtuples,甚 ...

  8. Python学习笔记整理总结【网络编程】【线程/进程/协程/IO多路模型/select/poll/epoll/selector】

    一.socket(单链接) 1.socket:应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socke ...

  9. Python学习笔记整理总结【Django】:Model操作(二)

    1.操作汇总 # 增 # # models.Tb1.objects.create(c1='xx', c2='oo') 增加一条数据,可以接受字典类型数据 **kwargs # obj = models ...

随机推荐

  1. 《Java 8 in Action》Chapter 8:重构、测试和调试

    我们会介绍几种方法,帮助你重构代码,以适配使用Lambda表达式,让你的代码具备更好的可读性和灵活性.除此之外,我们还会讨论目前比较流行的几种面向对象的设计模式, 包括策略模式.模板方法模式.观察者模 ...

  2. Spring学习之旅(十一)--JDBC

    JDBC 是数据持久化的一种比较常见的方案,Spring 也对它进行了支持. 在开始 JDBC 的使用之前,我们要先做下一些准备工作. 配置数据源 在 Spring 上下文中可以数据源 Bean 有如 ...

  3. HTML+JavaScript自己动手做日历

    当我们需要在页面中显示某月的事项,或是选择某一段日期时,常常要使用到日历组件.这一组件同样有着许多现成的类库,然而亲自动手开发一个日历,从中了解其实现原理也是非常必要的.在本例中我们就将制作一款非常经 ...

  4. 逆序对 线段树&树状数组 (重制版)

    逆序对的定义:长度为n的数组a,求满足i<j时a[i]>a[j]条件的数对个数. 第一次接触这种问题的人可能是更先想到的是n^2去暴力数前面有几个比他大的数. int main() { i ...

  5. mysql之innodb日志管理

    本文从两个方面进行阐述,常规的日志文件(不区分存储引擎),第二就是讲innodb存储引擎的事务日志. 一.基本日志文件 1.1.基本日志文件分类:错误日志(error log)慢查询日志日志(slow ...

  6. 【Ehcache】基础知识学习

    一.Ehcache概述 1.1 简介 1.2 Ehcache的主要特性 二.Ehcache使用介绍 2.1 Ehcache缓存过期策略 2.2 如何解决缓存与db不同步的问题. 三.Ehcache 基 ...

  7. postman--请求以及变量设置的实例练习

    我们可以在2个地方添加需要执行的js脚本,一个是Pre-request Script,还有一个tests,我们先看请求之前的 1 在请求被发送到服务器之前:就是在“Pre-request Script ...

  8. Git学习-安装与创建本地仓库

    前言 以前公司进行项目的版本管理都是用svn,最近公司推荐用git,把svn给关闭了.没办法,拿来主义.网上一番猛操作,勉强也能用了,给自己做个笔记. git安装 因为我用的是windos系统,在Wi ...

  9. Golang error 的突围

    目录 error 的困局 尝试破局 Errors are just values handle not just check errors Only handle errors once 小结 胎死腹 ...

  10. Java线程的几种状态(基于Oracle jdk 1.8)

    Java中线程的状态定义在java.lang.Thread类中的一个枚举中. public enum State { /** * Thread state for a thread which has ...