19周 11章  django ORM基本创建类型以及生成数据库结构
类型:
dbfirst  :通过数据库创建类
codefirst:先创建类 再创建数据库 --最常用
ORM的意思: 通过类创建数据库
对数据库操作步骤如下:
1、默认链接 sqlite  如果要链接mysql 需要进行配置:
前提:需要创建mysql数据库:dbname
DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME':'dbname',
    'USER': 'root',
    'PASSWORD': 'xxx',
    'HOST': '192.168.0.92',
    'PORT': '3306',
    }
}
2、在project同名文件夹的__init__文件中添加如下代码:
import pymysql
pymysql.install_as_MySQLdb()
 
3、admin后台注册表,admin内容如下:
from django.contrib import admin
from app01 import models
admin.site.register(models.UserInfo)
# Register your models here.
4、配置pycharm环境变量
4.1、Run  -->  EditConfigures 
4.2、里面所有文件点开,修改里面的Environment variables 添加一项。
名称是DJANGO_SETTINGS_MODULE  值是settings.py文件所在的目录名称,比如 untitled4.settings
如果没有配置pycharm环境变量,是无法写入数据库中数据的,而且单个运行views.py会报如下错误:
django.core.exceptions.ImproperlyConfigured: Requested setting CACHES, but settings are not configured.
You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings
5、创建model表,根据类自动创建数据表
from django.db import models
class UserInfo(models.Model):
    #自动创建 id列  自增主键
    username=models.CharField(max_length=32)
    password=models.CharField(max_length=64)
6、生成相应的表,执行命令:
python manage.py makemigrations
python manage.py migrate
直接结果如下:
[root@test3 project]# python manage.py makemigrations
Migrations for 'app02':
app02/migrations/0001_initial.py
- Create model UserInfo
[root@test3 project]# python manage.py migrate
Operations to perform:
Apply all migrations: admin, app02, auth, contenttypes, sessions
Running migrations:
Applying app02.0001_initial... OK
7、在views.py中定义对数据进行增删改查,models.py内容如下:
from app01 import models
def orm(request):
    models.UserInfo.objects.create(username='root', password='123', )
    obj = models.UserInfo(username='bob', password='456')
    obj.save()
8、测试
先单个执行urls.py、models.py、views.py  如果报错就对照错误排错把,否则运行了项目也无法写入到数据库
19周 13章   django ORM  基本操作 增、删、改、查
1、先导入模块
from app01 import models
    创建
    models.UserInfo.objects.create(username='root',password='123',)
    obj=models.UserInfo(username='bob',password='456')
    obj.save()
    dic={'username':'jack','password':'789'}
    models.UserInfo.objects.create(dic)
    查
    result=models.UserInfo.objects.all()
    result=models.UserInfo.objects.filter(username='root',password=999)
    拿到的是一个对象,而且是名字、密码都一样的第一个
    obj=models.UserInfo.objects.filter(username=u,password=p).first()
    
    取对象中的某一个数据
    obj=models.UserInfo.objects.filter(id=3).first()
    print(obj.username)
    
    拿到的是一个列表,而且是名字、密码都一样的多个
    obj=models.UserInfo.objects.filter(username=u,password=p)
    循环拿列表中的某一个数据:
def orm(request):
obj=models.UserInfo.objects.filter(id=3)
    for i in obj:
        print(i.username)
    return HttpResponse('orm')
    
    删除:
    models.UserInfo.objects.filter().delete()
    更新
    models.UserInfo.objects.all().update(password=888)
    models.UserInfo.objects.filter(id=1).update(password=999
第19章\urls.py
urlpatterns = [
    url(r'^cmdb/',include("app01.urls")),
    url(r'^monitor/',include("app02.urls")),
    ]
app01\views.py
from app01 import models
def orm(request):
    创建
    models.UserInfo.objects.create(username='root',password='123',)
    obj=models.UserInfo(username='bob',password='456')
    obj.save()
    dic={'username':'jack','password':'789'}
    models.UserInfo.objects.create(dic)
    查
    result=models.UserInfo.objects.all()
    result=models.UserInfo.objects.filter(username='root',password=999)
    
    删除:
    models.UserInfo.objects.filter().delete()
    更新
    models.UserInfo.objects.all().update(password=888)
    models.UserInfo.objects.filter(id=1).update(password=999
第19章 14节 基于ORM实现用户登录:
报错问题:
1、访问页面没有内容,返回200错误,说明肯定是html里面的内容写错了
2、ValueError: not enough values to unpack (expected 2, got 1)     
    
   这个错误说明:obj=models.UserInfo.objects.filter(id=nid).first()  这个里面没有写“id=” 
   
   或者:{'obj':obj}  这个写错了  
   总之是括号里面的少个东西
3、url一定要写成这样格式,否则很容易报错
   url(r'^userdetail-(?P<nid>\d+)/', views.user_detail,),
ORM实例:
app01/urls.py内容如下:
"""第19章 URL Configuration
from django.contrib import admin
from django.urls import path
from app01 import views
from django.conf.urls import url
urlpatterns = [
    path('login/', views.login),
    path('index/', views.index,),
    path('user_info/', views.user_info,),
    url(r'^userdetail-(?P<nid>\d+)/', views.user_detail,),
    path('orm/', views.orm),
    ]
app01/views.py内容如下:
from django.shortcuts import render
from django.shortcuts import HttpResponse
from django.shortcuts import redirect
import urllib
# Create your views here.
# USER_DICT={
#     'k1':'root1',
#     'k2':'root2',
#     'k3':'root3',
#     'k4':'root4',
# }
USER_DICT={
    '1':{'name':'root1','email':'root@123.com'},
    '2':{'name':'root2','email':'root@123.com'},
    '3':{'name':'root3','email':'root@123.com'},
    '4':{'name':'root4','email':'root@123.com'}
}
def index(request):
    return render(request,'index.html')
def user_info(request):
    user_list=models.UserInfo.objects.all()
    #print(user_list.query)
    return render(request,'user_info.html',{'user_list':user_list})
def user_detail(request,nid):
    obj=models.UserInfo.objects.filter(id=nid).first()
    return render(request,'user_detail.html',{'obj':obj})
def login(request):
    if request.method=="GET":
        return render(request,'login.html')
    elif request.method=="POST":
        #数据库中执行 select 判断用户名和密码是否中确
        u=request.POST.get('user')
        p=request.POST.get('pwd')
        #count=models.UserInfo.objects.filter(username=u,password=p).count() 也可以,但是不经常用
        obj=models.UserInfo.objects.filter(username=u, password=p).first()
        #print(obj)
        #下面意思:如果obj为真
        if obj:
            return redirect('/cmdb/index/')
        else:
            return render(request,'login.html')
    else:
        return redirect('/index/')
from app01 import models
def orm(request):
    #创建
    #models.UserInfo.objects.create(username='root',password='123',)
    # obj=models.UserInfo(username='bob',password='456')
    # obj.save()
    # dic={'username':'jack','password':'789'}
    # models.UserInfo.objects.create(dic)
    #查
    result=models.UserInfo.objects.all()
    #result=models.UserInfo.objects.filter(username='root',password=999)
    #
    #删除:
    #models.UserInfo.objects.filter().delete()
    #更新
    #models.UserInfo.objects.all().update(password=888)
    # obj=models.UserInfo.objects.filter(id=3)
    # for i in obj:
    #     print(i.username)
    #
    return HttpResponse('orm')
# from django.views import View
#
# class Home(View):
#     def dispatch(self, request, *args, **kwargs):
#         print('before')#kkkk
#         result=super(Home,self).dispatch(request, *args, **kwargs)
#         print('after')
#         return result
#
#     def get(self,request):
#         print(request.method)
#         return render(request,'home.html')
#     def post(self,request):
#         print(request.method)
#         return render(request,'home.html')
templates/login.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="提交">
    </form>
</body>
</html>
templates/index.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">
    欢迎到来
    </div>
    <div>
        <div style="position: absolute;top: 48px;bottom: 0;left: 0;width: 200px;background-color: aquamarine">
            <a class="menu" href="/cmdb/user_info/">用户管理</a>
            <a class="menu" href="/cmdb/user_group/">用户组管理</a>
        </div>
    </div>
    <div style="position: absolute;top: 48px;bottom: 0;left: 210px;width: 0;overflow: auto">
    </div>
</body>
</html>
templates/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">
    欢迎到来
    </div>
    <div>
        <div style="position: absolute;top: 48px;bottom: 0;left: 0;width: 200px;background-color: aquamarine">
            <a class="menu" href="/cmdb/user_info/">用户管理</a>
            <a class="menu" href="/cmdb/user_group/">用户组管理</a>
        </div>
    </div>
    <div style="position: absolute;top: 48px;bottom: 0;left: 210px;width: 700px;overflow: auto;background-color: antiquewhite">
        <h3>用户列表</h3>
        <ul>
            {% for row in user_list %}
                <li><a href="/cmdb/userdetail-{{ row.id }}/">{{ row.username }}</a></li>
            {% endfor %}
        </ul>
    </div>
</body>
</html>
templates/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">
    欢迎到来
    </div>
    <div>
        <div style="position: absolute;top: 48px;bottom: 0;left: 0;width: 200px;background-color: aquamarine">
            <a class="menu" href="/cmdb/user_info/">用户管理</a>
            <a class="menu" href="/cmdb/user_group/">用户组管理</a>
        </div>
    </div>
    <div style="position: absolute;top: 48px;bottom: 0;left: 210px;width: 700px;overflow: auto;background-color: antiquewhite">
        <h1>用户详细信息</h1>
        <h2>{{ obj.id }}</h2>
        <h2>{{ obj.name }}</h2>
        <h2>{{ obj.password }}</h2>
    </div>
</body>
</html>
19周-15章python基于 Django 基于ORM实现用户增加、删除、修改、查看
models.Business.objects.all()
是个对象
models.Business.objects.values('id','caption')
#[{'id':'1','caption':'运维','code':'sa'}] values 是个字典
models.Business.objects.values_list('id','caption')
#[(1,运维),(2,市场)]  values_list 是个元组
1、
注意:method="post"  一定要写。一定是小写  否则报错
<form action="/cmdb/user_info/" method="post">
2、
注意href和action、return redirect三个的区分,容易混淆
这是做的跳转:
<a class="menu" href="/cmdb/user_info/">用户管理</a> 
      
这是提交的当前的页面:
<form method="post" action="/cmdb/useredit-{{ obj.id }}/">
这个不加html
return redirect用法:不加html
return redirect('/cmdb/index/')
3、
根据id删除用户的瞬间跳转到当前页面
<a href="/cmdb/userdel-{{ row.id }}/"> 删除 </a>
def user_del(request,nid):
    models.UserInfo.objects.filter(id=nid).delete()
    return redirect('/cmdb/user_info/')
4、
注意不成功的话  重新打开一个页面试试
5、
注意:<input type="text" name="id" value="1"/>    value的意思是可以在输入框中显示出来id
style="display: none"
6、
注意form表单里面action路径 一定要和 url里面的保持一致,否则报错,
例如:
href="/cmdb/userdetail-{{ row.id }}   
url(r'^userdetail-(?P<nid>\d+)/', views.user_detail,),
app01/urls.py
"""第19章 URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from app01 import views
from django.conf.urls import url
urlpatterns = [
    path('login/', views.login),
    path('index/', views.index,),
    path('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,),
    path('orm/', views.orm),
    ]
app01/views.py
from django.shortcuts import render
from django.shortcuts import HttpResponse
from django.shortcuts import redirect
from app01 import models
import urllib
# Create your views here.
# USER_DICT={
#     'k1':'root1',
#     'k2':'root2',
#     'k3':'root3',
#     'k4':'root4',
# }
USER_DICT={
    '1':{'name':'root1','email':'root@123.com'},
    '2':{'name':'root2','email':'root@123.com'},
    '3':{'name':'root3','email':'root@123.com'},
    '4':{'name':'root4','email':'root@123.com'}
}
def index(request):
    return render(request,'index.html')
def user_info(request):
    if request.method=="GET":
        user_list=models.UserInfo.objects.all()
        return render(request,'user_info.html',{'user_list':user_list})
    elif request.method=="POST":
        u=request.POST.get('user')
        p=request.POST.get('pwd')
        models.UserInfo.objects.create(username=u,password=p)
        user_list=models.UserInfo.objects.all()
    #print(user_list.query)
        return render(request,'user_info.html',{'user_list':user_list})
def user_del(request,nid):
    models.UserInfo.objects.filter(id=nid).delete()
    return redirect('/cmdb/user_info/')
def user_edit(request,nid):
    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_detail/')
def user_detail(request,nid):
    obj=models.UserInfo.objects.filter(id=nid).first()
    return render(request,'user_detail.html',{'obj':obj})
def login(request):
    #models.UserGroup.objects.create(caption='DBA')
    if request.method=="GET":
        return render(request,'login.html')
    elif request.method=="POST":
        #数据库中执行 select 判断用户名和密码是否中确
        u=request.POST.get('user')
        p=request.POST.get('pwd')
        #count=models.UserInfo.objects.filter(username=u,password=p).count() 也可以,但是不经常用
        obj=models.UserInfo.objects.filter(username=u,password=p).first()
        #print(obj)
        #下面意思:如果obj为真
        if obj:
            return redirect('/cmdb/index/')
        else:
            return render(request,'login.html')
    else:
        return redirect('/index/')
def orm(request):
    #创建
    #models.UserInfo.objects.create(username='root',password='123',)
    # obj=models.UserInfo(username='bob',password='456')
    # obj.save()
    # dic={'username':'jack','password':'789'}
    # models.UserInfo.objects.create(dic)
    #查
    result=models.UserInfo.objects.all()
    #result=models.UserInfo.objects.filter(username='root',password=999)
    #
    #删除:
    #models.UserInfo.objects.filter().delete()
    #更新
    #models.UserInfo.objects.all().update(password=888)
    # obj=models.UserInfo.objects.filter(id=3)
    # for i in obj:
    #     print(i.username)
    #
    return HttpResponse('orm')
# from django.views import View
#
# class Home(View):
#     def dispatch(self, request, *args, **kwargs):
#         print('before')#kkkk
#         result=super(Home,self).dispatch(request, *args, **kwargs)
#         print('after')
#         return result
#
#     def get(self,request):
#         print(request.method)
#         return render(request,'home.html')
#     def post(self,request):
#         print(request.method)
#         return render(request,'home.html')
templates/index.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">
    欢迎到来
    </div>
    <div>
        <div style="position: absolute;top: 48px;bottom: 0;left: 0;width: 200px;background-color: aquamarine">
            <a class="menu" href="/cmdb/user_info/">用户管理</a>
            <a class="menu" href="/cmdb/user_group/">用户组管理</a>
        </div>
    </div>
    <div style="position: absolute;top: 48px;bottom: 0;left: 210px;width: 0;overflow: auto">
    </div>
</body>
</html>
templates/login.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="提交">
    </form>
</body>
</html>
templates/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">
    欢迎到来
</div>
<div>
    <div style="position: absolute;top: 48px;bottom: 0;left: 0;width: 200px;background-color: aquamarine">
        <a class="menu" href="/cmdb/user_info/">用户管理</a>
        <a class="menu" href="/cmdb/user_group/">用户组管理</a>
    </div>
</div>
<div style="position: absolute;top: 48px;bottom: 0;left: 210px;width: 700px;overflow: auto;background-color: antiquewhite">
    <h3>添加用户</h3>
    <form action="/cmdb/user_info/" method="post">
        <input type="text" name="user"/>
        <input type="text" name="pwd"/>
        <input type="submit" value="添加"/>
    </form>
    <h3>用户列表</h3>
    <ul>
        {% for row in user_list %}
            <li><a href="/cmdb/userdetail-{{ row.id }}/">{{ row.username }} </a> |
            <a href="/cmdb/userdel-{{ row.id }}/"> 删除 </a> |
            <a href="/cmdb/useredit-{{ row.id }}/"> 编辑 </a>
            </li>
        {% endfor %}
    </ul>
</div>
</body>
</html>
templates/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">
    欢迎到来
    </div>
    <div>
        <div style="position: absolute;top: 48px;bottom: 0;left: 0;width: 200px;background-color: aquamarine">
            <a class="menu" href="/cmdb/user_info/">用户管理</a>
            <a class="menu" href="/cmdb/user_group/">用户组管理</a>
        </div>
    </div>
    <div style="position: absolute;top: 48px;bottom: 0;left: 210px;width: 700px;overflow: auto;background-color: antiquewhite">
        <h1>用户详细信息</h1>
        <h2>{{ obj.id }}</h2>
        <h2>{{ obj.name }}</h2>
        <h2>{{ obj.password }}</h2>
    </div>
</body>
</html>
templates/user_edit.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>编辑用户</h1>
    <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" name="提交" >
    </form>
</body>
</html>
19周 16章   Django 字段类型介绍
字符串、数字、时间、二进制、自增
# Create your models here.
class UserGroup(models.Model):
    uid=models.AutoField(primary_key=True)
    caption=models.CharField(max_length=50)
class UserInfo(models.Model):
    #自动创建 id列  自增主键
    username=models.CharField(max_length=32)
    password=models.CharField(max_length=60)
    email=models.CharField(max_length=60)
    #gender=models.CharField(max_length=60,null=True)
    test=models.EmailField(max_length=20,null=True)
更新表:
password=models.CharField(max_length=60)
make manage.py makemigrations
make manage.py migrate
 
增加表:
1、
email=models.CharField(max_length=60)
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 2) Quit, and let me add a default in models.py
Select an option: 1
Please enter the default value now, as valid Python
The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now
Type 'exit' to exit this prompt
Invalid input: name 'jack' is not defined
>>> 'bob'
make manage.py makemigrations
make manage.py migrate
然后关掉软件,重新打开才生效。
2、、
gender=models.CharField(max_length=60,null=True)
   make manage.py makemigrations
   make manage.py migrate
 
删除表:
#gender=models.CharField(max_length=60,null=True)
make manage.py makemigrations
   make manage.py migrate
自增:
class UserGroup(models.Model):
    uid=models.AutoField(primary_key=True)
    caption=models.CharField(max_length=50)
19周 17章:Django ORM字段参数介绍: 这些都是在Django admin里面使用
    null                数据库中字段是否可以为空
    db_column           数据库中字段的列名
    db_tablespace
    default             数据库中字段的默认值
    primary_key         数据库中字段是否为主键
    db_index            数据库中字段是否可以建立索引
    unique              数据库中字段是否可以建立唯一索引
    unique_for_date     数据库中字段【日期】部分是否可以建立唯一索引
    unique_for_month    数据库中字段【月】部分是否可以建立唯一索引
    unique_for_year     数据库中字段【年】部分是否可以建立唯一索引
    verbose_name        Admin中显示的字段名称
    blank               Admin中是否允许用户输入为空   
            
            username=models.CharField(max_length=50,blank=True,verbose_name='用户名')
    editable            Admin中是否可以编辑
    help_text           Admin中该字段的提示信息
    choices             Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
                        如:gf = models.IntegerField(choices=[(0, '何穗'),(1, '大表姐'),],default=1)
    error_messages      自定义错误信息(字典类型),从而定制想要显示的错误信息;
                        字典健:null, blank, invalid, invalid_choice, unique, and unique_for_date
                        如:{'null': "不能为空.", 'invalid': '格式错误'}
    validators          自定义错误验证(列表类型),从而定制想要的验证规则
               
    auto_now
        uptime=models.DateTimeField(auto_now=True,null=True)
        自动更新时间:
        错误方式;
        obj=UserGroup.objects.filter(id=1).update(caption='CEO')
        正确方式;
        obj=UserGroup.objects.filter(id=1).first()
            obj.caption="CEO"
            obj.save()
     choices  :用在admin
               user_type_id=models.IntegerField(choices=user_type_choice,default=1)
          user_type_choice=(
            (1,'超级用户'),
            (2,'白金客户'),
            (3,'普通客户'),
        )
            user_type_id=models.IntegerField(choices=user_type_choice,default=1)
19周 18章:Django ORM外键操作
外键的意思:
主要作用就是把两个数据库表连接起来,比如把员工组表、员工信息表给连接起来
注意python3.7外键的变化:
user_group=models.ForeignKey("UserGroup",to_field='uid',default=1,on_delete=models.CASCADE)
注意:怎么取里面的值
row.user_group 是个对象
user_list=Userinfo.object.all()
for row in user_list:
    print(row.user_group_id) = print(row.user_group.uid)
        print(row.user_group.caption)
<ul>
            {% for row in user_list %}
                <li><a href="/cmdb/userdetail-{{ row.id }}/">{{ row.username }}</a>
                <span>{{ row.user_group.caption }}</span>
                </li>
            {% endfor %}
</ul>
实例:接之前的,变动的如下:
app01/models.py
from django.db import models
# Create your models here.
class UserGroup(models.Model):
    uid=models.AutoField(primary_key=True)
    caption=models.CharField(max_length=50)
    ctime=models.DateTimeField(auto_now_add=True,null=True)
    uptime=models.DateTimeField(auto_now=True,null=True)
    #username=models.CharField(max_length=50,blank=True)
class UserInfo(models.Model):
    #自动创建 id列  自增主键
    username=models.CharField(max_length=32)
    password=models.CharField(max_length=60)
    email=models.CharField(max_length=60)
    #gender=models.CharField(max_length=60,null=True)
    test=models.EmailField(max_length=20,null=True)
    username=models.CharField(max_length=50,blank=True,verbose_name='用户名')
    user_group=models.ForeignKey("UserGroup",to_field='uid',default=1,on_delete=models.CASCADE)
    user_type_choice=(
        (1,'超级用户'),
        (2,'白金客户'),
        (3,'普通客户'),
    )
    user_type_id=models.IntegerField(choices=user_type_choice,default=1)
templates/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">
    欢迎到来
</div>
<div>
    <div style="position: absolute;top: 48px;bottom: 0;left: 0;width: 200px;background-color: aquamarine">
        <a class="menu" href="/cmdb/user_info/">用户管理</a>
        <a class="menu" href="/cmdb/user_group/">用户组管理</a>
    </div>
</div>
<div style="position: absolute;top: 48px;bottom: 0;left: 210px;width: 700px;overflow: auto;background-color: antiquewhite">
    <h3>添加用户</h3>
    <form action="/cmdb/user_info/" method="post">
        <input type="text" name="user"/>
        <input type="text" name="pwd"/>
        <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>
</body>
</html>
第19章/urls.py
"""第19章 URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from app01 import views
from django.conf.urls import url
from django.conf.urls import url,include
import urllib
urlpatterns = [
    path('login/', views.login),
    path('index/', views.index,),
    path('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,),
    path('orm/', views.orm),
    ]
19周 19章:  外键实现增加用户(含select标签)
注意下面多个是这么写:弄得好苦
return render(request,'user_info.html',{'user_list':user_list,"group_list":group_list})
app01/views.py
from django.shortcuts import render
from django.shortcuts import HttpResponse
from django.shortcuts import redirect
from app01 import models
import urllib
# Create your views here.
# USER_DICT={
#     'k1':'root1',
#     'k2':'root2',
#     'k3':'root3',
#     'k4':'root4',
# }
USER_DICT={
    '1':{'name':'root1','email':'root@123.com'},
    '2':{'name':'root2','email':'root@123.com'},
    '3':{'name':'root3','email':'root@123.com'},
    '4':{'name':'root4','email':'root@123.com'}
}
def index(request):
    return render(request,'index.html')
def user_info(request):
    if request.method=="GET":
        user_list=models.UserInfo.objects.all()
        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)
        user_list=models.UserInfo.objects.all()
    #print(user_list.query)
        return render(request,'user_info.html',{'user_list':user_list})
def user_del(request,nid):
    models.UserInfo.objects.filter(id=nid).delete()
    return redirect('/cmdb/user_info/')
def user_edit(request,nid):
    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_detail/')
def user_detail(request,nid):
    obj=models.UserInfo.objects.filter(id=nid).first()
    return render(request,'user_detail.html',{'obj':obj})
def login(request):
    #models.UserGroup.objects.create(caption='DBA')
    if request.method=="GET":
        return render(request,'login.html')
    elif request.method=="POST":
        #数据库中执行 select 判断用户名和密码是否中确
        u=request.POST.get('user')
        p=request.POST.get('pwd')
        #count=models.UserInfo.objects.filter(username=u,password=p).count() 也可以,但是不经常用
        obj=models.UserInfo.objects.filter(username=u,password=p).first()
        #print(obj)
        #下面意思:如果obj为真
        if obj:
            return redirect('/cmdb/index/')
        else:
            return render(request,'login.html')
    else:
        return redirect('/index/')
def orm(request):
    #创建
    #models.UserInfo.objects.create(username='root',password='123',)
    # obj=models.UserInfo(username='bob',password='456')
    # obj.save()
    # dic={'username':'jack','password':'789'}
    # models.UserInfo.objects.create(dic)
    #查
    result=models.UserInfo.objects.all()
    #result=models.UserInfo.objects.filter(username='root',password=999)
    models.UserInfo.objects.create(
        username='root1',
        password=123,
        email='123@.com',
        test='ceshi',
        user_group_id=1,
    )
    #删除:
    #models.UserInfo.objects.filter().delete()
    #更新
    #models.UserInfo.objects.all().update(password=888)
    # obj=models.UserInfo.objects.filter(id=3)
    # for i in obj:
    #     print(i.username)
    #
    return HttpResponse('orm')
# from django.views import View
#
# class Home(View):
#     def dispatch(self, request, *args, **kwargs):
#         print('before')#kkkk
#         result=super(Home,self).dispatch(request, *args, **kwargs)
#         print('after')
#         return result
#
#     def get(self,request):
#         print(request.method)
#         return render(request,'home.html')
#     def post(self,request):
#         print(request.method)
#         return render(request,'home.html')
app01/models.py
from django.db import models
# Create your models here.
class UserGroup(models.Model):
    uid=models.AutoField(primary_key=True)
    caption=models.CharField(max_length=50)
    ctime=models.DateTimeField(auto_now_add=True,null=True)
    uptime=models.DateTimeField(auto_now=True,null=True)
    #username=models.CharField(max_length=50,blank=True)
class UserInfo(models.Model):
    #自动创建 id列  自增主键
    username=models.CharField(max_length=32)
    password=models.CharField(max_length=60)
    email=models.CharField(max_length=60)
    #gender=models.CharField(max_length=60,null=True)
    test=models.EmailField(max_length=20,null=True)
    username=models.CharField(max_length=50,blank=True,verbose_name='用户名')
    user_group=models.ForeignKey("UserGroup",to_field='uid',default=1,on_delete=models.CASCADE)
    user_type_choice=(
        (1,'超级用户'),
        (2,'白金客户'),
        (3,'普通客户'),
    )
    user_type_id=models.IntegerField(choices=user_type_choice,default=1)
app01/urls.py
"""第19章 URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from app01 import views
from django.conf.urls import url
from django.conf.urls import url,include
import urllib
urlpatterns = [
    path('login/', views.login),
    path('index/', views.index,),
    path('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,),
    path('orm/', views.orm),
    ]
templates/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">
    欢迎到来
</div>
<div>
    <div style="position: absolute;top: 48px;bottom: 0;left: 0;width: 200px;background-color: aquamarine">
        <a class="menu" href="/cmdb/user_info/">用户管理</a>
        <a class="menu" href="/cmdb/user_group/">用户组管理</a>
    </div>
</div>
<div style="position: absolute;top: 48px;bottom: 0;left: 210px;width: 700px;overflow: auto;background-color: antiquewhite">
    <h3>添加用户</h3>
    <form action="/cmdb/user_info/" method="post">
        <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>
</body>
</html>
templates/index.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">
    欢迎到来
    </div>
    <div>
        <div style="position: absolute;top: 48px;bottom: 0;left: 0;width: 200px;background-color: aquamarine">
            <a class="menu" href="/cmdb/user_info/">用户管理</a>
            <a class="menu" href="/cmdb/user_group/">用户组管理</a>
        </div>
    </div>
    <div style="position: absolute;top: 48px;bottom: 0;left: 210px;width: 0;overflow: auto">
    </div>
</body>
</html>
templates/login.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="提交">
    </form>
</body>
</html>
templates/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">
    欢迎到来
    </div>
    <div>
        <div style="position: absolute;top: 48px;bottom: 0;left: 0;width: 200px;background-color: aquamarine">
            <a class="menu" href="/cmdb/user_info/">用户管理</a>
            <a class="menu" href="/cmdb/user_group/">用户组管理</a>
        </div>
    </div>
    <div style="position: absolute;top: 48px;bottom: 0;left: 210px;width: 700px;overflow: auto;background-color: antiquewhite">
        <h1>用户详细信息</h1>
        <h2>{{ obj.id }}</h2>
        <h2>{{ obj.name }}</h2>
        <h2>{{ obj.password }}</h2>
    </div>
</body>
</html>
templates/user_edit.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>编辑用户</h1>
    <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" name="提交" >
    </form>
</body>
</html>
访问:
http://127.0.0.1:8000/cmdb/user_info/
第20章 03节  Django 一对多创建介绍
第20章 04节  Django 创建  一对多表结构
1、先创建一个工程
app01/models.py
from django.db import models
# Create your models here.
class Business(models.Model):
    caption=models.CharField(max_length=32)
class Host(models.Model):
    nid=models.AutoField(primary_key=True)
    hostname=models.CharField(max_length=32,db_index=True)
    ip=models.GenericIPAddressField(protocol="both",max_length=32,db_index=True)
    port=models.IntegerField()
    b=models.ForeignKey(to="Business",to_field='id',on_delete=models.CASCADE)
第20章-05    获取单表数据的三种方式
models.Business.objects.all()
是个对象
models.Business.objects.values('id','caption')
#[{'id':'1','caption':'运维','code':'sa'}] values 是个字典
models.Business.objects.values_list('id','caption')
#[(1,运维),(2,市场)]  values_list 是个元组
第20章/settings.py
"""
Django settings for 第20章 project.
Generated by 'django-admin startproject' using Django 2.0.3.
For more information on this file, see
https://docs.djangoproject.com/en/2.0/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.0/ref/settings/
"""
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'u#@z=2@*h^sph5$uqwo+gwgml#ivnq&l@b7-9jg8ve@pmv4z_6'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01',
]
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    #'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = '第20章.urls'
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
WSGI_APPLICATION = '第20章.wsgi.application'
# Database
# https://docs.djangoproject.com/en/2.0/ref/settings/#databases
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
# Password validation
# https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]
# Internationalization
# https://docs.djangoproject.com/en/2.0/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.0/howto/static-files/
STATIC_URL = '/static/'
STATICFILES_DIRS=(
    os.path.join(BASE_DIR,'static'),
)
app01/models.py
from django.db import models
# Create your models here.
class Business(models.Model):
    caption=models.CharField(max_length=32)
    code=models.CharField(max_length=32,null=True)
class Host(models.Model):
    nid=models.AutoField(primary_key=True)
    hostname=models.CharField(max_length=32,db_index=True)
    ip=models.GenericIPAddressField(protocol="both",max_length=32,db_index=True)
    port=models.IntegerField()
    b=models.ForeignKey(to="Business",to_field='id',on_delete=models.CASCADE)
第20章/urls.py
"""第20章 URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from app01 import views
from django.conf.urls import url
urlpatterns = [
    path('admin/', admin.site.urls),
    #path('business/', views.business,),
    url(r'^business/$', views.business,),
]
app01/views.py
from django.shortcuts import render
# Create your views here.
from app01 import models
def business(request):
    v1=models.Business.objects.all()
    v2=models.Business.objects.values('id','caption')
    #[{'id':'1','caption':'运维','code':'sa'}] values 对象是个字典
    v3=models.Business.objects.values_list('id','caption')
    #[(1,运维),(2,市场)]  values_list 对象是个元组
    return render(request,'business.html',{'v1':v1,'v2':v2,'v3':v3})
templates/business.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>业务线列表(对象)</h1>
    <ul>
        {% for row in v1 %}
        <li>{{ row.id }} - {{ row.caption }} - {{ row.code }}</li>
        {% endfor %}
    </ul>
    <h1>业务线列表(字典)</h1>
    <ul>
        {% for row in v2 %}
        <li>{{ row.id }} - {{ row.caption }} </li>
        {% endfor %}
    </ul>
    <h1>业务线列表(元组)</h1>
    <ul>
        {% for row in v3 %}
        <li>{{ row.0 }} - {{ row.1 }} </li>
        {% endfor %}
    </ul>
</body>
</html>
第20章-06    一对多跨表操作
实例接上面:
第20章/settings.py
"""
Django settings for 第20章 project.
Generated by 'django-admin startproject' using Django 2.0.3.
For more information on this file, see
https://docs.djangoproject.com/en/2.0/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.0/ref/settings/
"""
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'u#@z=2@*h^sph5$uqwo+gwgml#ivnq&l@b7-9jg8ve@pmv4z_6'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01',
]
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    #'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = '第20章.urls'
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
WSGI_APPLICATION = '第20章.wsgi.application'
# Database
# https://docs.djangoproject.com/en/2.0/ref/settings/#databases
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
# Password validation
# https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]
# Internationalization
# https://docs.djangoproject.com/en/2.0/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.0/howto/static-files/
STATIC_URL = '/static/'
STATICFILES_DIRS=(
    os.path.join(BASE_DIR,'static'),
)
app01/models.py
from django.db import models
# Create your models here.
class Business(models.Model):
    caption=models.CharField(max_length=32)
    code=models.CharField(max_length=32,null=True)
class Host(models.Model):
    nid=models.AutoField(primary_key=True)
    hostname=models.CharField(max_length=32,db_index=True)
    ip=models.GenericIPAddressField(protocol="both",max_length=32,db_index=True)
    port=models.IntegerField()
    b=models.ForeignKey(to="Business",to_field='id',on_delete=models.CASCADE)
第20章/urls.py
"""第20章 URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from app01 import views
from django.conf.urls import url
urlpatterns = [
    path('admin/', admin.site.urls),
    #path('business/', views.business,),
    url(r'^business/$', views.business,),
    url(r'^host/$', views.host,),
]
app01/views.py
from django.shortcuts import render,HttpResponse
# Create your views here.
from app01 import models
def business(request):
    v1=models.Business.objects.all()
    v2=models.Business.objects.values('id','caption')
    #[{'id':'1','caption':'运维','code':'sa'}] values 是个字典
    v3=models.Business.objects.values_list('id','caption')
    #[(1,运维),(2,市场)]  values_list 是个元组
    return render(request,'business.html',{'v1':v1,'v2':v2,'v3':v3})
def host(request):
    v1=models.Host.objects.filter(nid__gt=0)
    return render(request,'host.html',{'v1':v1})
templates/business.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>业务线列表(对象)</h1>
    <ul>
        {% for row in v1 %}
        <li>{{ row.id }} - {{ row.caption }} - {{ row.code }}</li>
        {% endfor %}
    </ul>
    <h1>业务线列表(字典)</h1>
    <ul>
        {% for row in v2 %}
        <li>{{ row.id }} - {{ row.caption }} </li>
        {% endfor %}
    </ul>
    <h1>业务线列表(元组)</h1>
    <ul>
        {% for row in v3 %}
        <li>{{ row.0 }} - {{ row.1 }} </li>
        {% endfor %}
    </ul>
</body>
</html>
templates/host.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>业务线列表</h1>
    <table border="1">
        <thead>
            <tr>
                <th>主机名</th>
                <th>ip地址</th>
                <th>端口</th>
                <th>业务线名称</th>
            </tr>
        </thead>
        <tbody>
            {% for row in v1 %}
            <tr ht_d="{{ row.nid }}" b_id="{{ row.b.id }}">
                <th>{{ row.hostname }}</th>
                <th>{{ row.ip }}</th>
                <th>{{ row.port }}</th>
                <th>{{ row.b.caption }}</th>
            </tr>
            {% endfor %}
        </tbody>
    </table>
</body>
</html>
第20周-07  一对多块表操作的三种方式
接上面:
app01/views.py
from django.shortcuts import render,HttpResponse
# Create your views here.
from app01 import models
def business(request):
    v1=models.Business.objects.all()
    # for row in v1:
    #     print(row.id,row.caption)
    v2=models.Business.objects.values('id','caption')
    # for row in v2:
    #     print(row['id'],row['caption'])
    #[{'id':'1','caption':'运维','code':'sa'}] values 是个字典
    v3=models.Business.objects.values_list('id','caption')
    #[(1,运维),(2,市场)]  values_list 是个元组
    return render(request,'business.html',{'v1':v1,'v2':v2,'v3':v3})
    #return HttpResponse('ok')
def host(request):
    v1=models.Host.objects.filter(nid__gt=0)
    # for row in v1:
    #     print(row.nid,row.hostname)
    v2=models.Host.objects.filter(nid__gt=0).values('nid','hostname','b_id','b__caption')
    # for row in v2:
    #     print(row['nid'],row['hostname'],row['b_id'])
    v3=models.Host.objects.filter(nid__gt=0).values_list('nid','hostname','b_id','b__caption')
    # for row in v3:
    #     print(row[0],row[1])
    #return HttpResponse('ok')
    return render(request,'host.html',{'v1':v1,'v2':v2,'v3':v3})
templates/host.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>主机列表(列表)</h1>
    <table border="1">
        <thead>
            <tr>
                <th>主机名</th>
                <th>ip地址</th>
                <th>端口</th>
                <th>业务线名称</th>
            </tr>
        </thead>
        <tbody>
        
            {% for row in v1 %}
            <tr ht-d="{{ row.nid }}" b-id="{{ row.b.id }}">
                <th>{{ row.hostname }}</th>
                <th>{{ row.ip }}</th>
                <th>{{ row.port }}</th>
                <th>{{ row.b.caption }}</th>
            </tr>
            {% endfor %}
        <tbody>
    </table>
    <h1>主机列表(字典)</h1>
    <table border="1">
        <thead>
            <tr>
                <th>主机名</th>
                <th>ip地址</th>
                <th>端口</th>
                <th>业务线名称</th>
            </tr>
        </thead>
        <tbody>
        
            {% for row in v1 %}
            <tr ht-d="{{ row.nid }}" b-id="{{ row.b.id }}">
                <th>{{ row.hostname }}</th>
                <th>{{ row.ip }}</th>
                <th>{{ row.port }}</th>
                <th>{{ row.b.caption }}</th>
            </tr>
            {% endfor %}
        <tbody>
    </table>
    <h1>业务线列表*(元组)</h1>
    <table border="1">
        <thead>
            <tr>
                <th>主机名</th>
                <th>ip地址</th>
            </tr>
        </thead>
        <tbody>
        
            {% for row in v3 %}
            <tr ht-d="{{ row.0 }}" b-id="{{ row.2 }}">
                <th>{{ row.1 }}</th>
                <th>{{ row.3 }}</th>
            </tr>
            {% endfor %}
        <tbody>
    </table>
</body>
</html>
第20周-09 增加一对多数据示例;  --添加主机--用模态对话框演示:
接上面:
app01/views.py
from django.shortcuts import render,HttpResponse,redirect
# Create your views here.
from app01 import models
def business(request):
    v1=models.Business.objects.all()
    # for row in v1:
    #     print(row.id,row.caption)
    v2=models.Business.objects.values('id','caption')
    # for row in v2:
    #     print(row['id'],row['caption'])
    #[{'id':'1','caption':'运维','code':'sa'}] values 是个字典
    v3=models.Business.objects.values_list('id','caption')
    #[(1,运维),(2,市场)]  values_list 是个元组
    return render(request,'business.html',{'v1':v1,'v2':v2,'v3':v3})
    #return HttpResponse('ok')
def host(request):
    if request.method=='GET':
        b_list=models.Business.objects.all()
    elif request.method=='POST':
        h=request.POST.get('hostname')
        i=request.POST.get('ip')
        p=request.POST.get('port')
        b=request.POST.get('b_id')
        models.Host.objects.create(hostname=h,ip=i,port=p,b_id=b)
        return redirect('/host/')
    v1=models.Host.objects.filter(nid__gt=0)
    # for row in v1:
    #     print(row.nid,row.hostname)
    v2=models.Host.objects.filter(nid__gt=0).values('nid','hostname','b_id','b__caption')
    # for row in v2:
    #     print(row['nid'],row['hostname'],row['b_id'])
    v3=models.Host.objects.filter(nid__gt=0).values_list('nid','hostname','b_id','b__caption')
    # for row in v3:
    #     print(row[0],row[1])
    #return HttpResponse('ok')
    return render(request,'host.html',{'v1':v1,'v2':v2,'v3':v3,'b_list':b_list})
templates/host.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .hide {
            display: none;
        }
        .shade {
            position: fixed;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
            background: black;
            opacity: 0.6;
            z-index: 100;
        }
        .add-modal {
            position: fixed;
            height: 300px;
            width: 400px;
            top: 100px;
            left: 50%;
            z-index: 101;
            border: 1px solid red;
            background: white;
            margin-left: -200px;
        }
    </style>
</head>
<body>
<h1>主机列表(列表)</h1>
<div>
    <input id="add_host" type="button" value="添加">
</div>
<table border="1">
    <thead>
    <tr>
        <th>序号</th>
        <th>主机名</th>
        <th>ip地址</th>
        <th>端口</th>
        <th>业务线名称</th>
    </tr>
    </thead>
    <tbody>
    {% for row in v1 %}
        <tr ht-d="{{ row.nid }}" b-id="{{ row.b.id }}">
            <th>{{ forloop.counter }}</th>
            <th>{{ row.hostname }}</th>
            <th>{{ row.ip }}</th>
            <th>{{ row.port }}</th>
            <th>{{ row.b.caption }}</th>
        </tr>
    {% endfor %}
    <tbody>
</table>
<h1>主机列表(字典)</h1>
<table border="1">
    <thead>
    <tr>
        <th>主机名</th>
        <th>ip地址</th>
        <th>端口</th>
        <th>业务线名称</th>
    </tr>
    </thead>
    <tbody>
    {% for row in v1 %}
        <tr ht-d="{{ row.nid }}" b-id="{{ row.b.id }}">
            <th>{{ row.hostname }}</th>
            <th>{{ row.ip }}</th>
            <th>{{ row.port }}</th>
            <th>{{ row.b.caption }}</th>
        </tr>
    {% endfor %}
    <tbody>
</table>
<h1>主机列表*(元组)</h1>
<table border="1">
    <thead>
    <tr>
        <th>主机名</th>
        <th>ip地址</th>
    </tr>
    </thead>
    <tbody>
    {% for row in v3 %}
        <tr ht-d="{{ row.0 }}" b-id="{{ row.2 }}">
            <th>{{ row.1 }}</th>
            <th>{{ row.3 }}</th>
        </tr>
    {% endfor %}
    <tbody>
</table>
<div class="shade hide"></div>
<div class="add-modal hide">
    <form method="post" action="/host/">
        <div class="group">
            <input type="text" placeholder="主机名" name="hostname">
        </div>
        <div class="group">
            <input type="text" placeholder="IP" name="ip">
        </div>
        <div class="group">
            <input type="text" placeholder="端口" name="port">
        </div>
        <div class="group">
            <select name="b_id">
                {% for op in b_list %}
                <option value="{{ op.id }}">{{ op.caption }}</option>
                {% endfor %}
            </select >
            <input type="submit" value="提交">
            <input id="cancle" type="button" value="取消">
        </div>
    </form>
</div>
<script src="/static/jquery-3.2.1.js"></script>
<script>
    $(function () {
        $('#add_host').click(function () {
            $('.add-modal,.shade').removeClass('hide');
        });
        $('#cancle').click(function(){
            $('.add-modal,.shade').addClass('hide');
        })
    })
</script>
</body>
</html>
19周 11章  django ORM基本创建类型以及生成数据库结构
类型:
dbfirst  :通过数据库创建类
codefirst:先创建类 再创建数据库 --最常用
ORM的意思: 通过类创建数据库
创建类
1、根据类自动创建书记库表
   配置 app下的model.py
2、根据类对数据库表中的数据进行各种操作
class UserInfo(models.Model):
    #自动创建 id列  自增主键
    username=models.CharField(max_length=32)
    password=models.CharField(max_length=64)
执行命令:
python manage.py makemigrations
python manage.py migrate
默认链接 sqlite  如果要链接myaql 需要进行配置:
前提:需要创建mysql表
DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME':'dbname',
    'USER': 'root',
    'PASSWORD': 'xxx',
    'HOST': '',
    'PORT': '',
    }
}
models.py
from django.db import models
# Create your models here.
class UserInfo(models.Model):
    #自动创建 id列  自增主键
    username=models.CharField(max_length=32)
    password=models.CharField(max_length=64)
19周 12章  django ORM使用mysql 注意:
需要先修改pymysql:在project同名文件夹的__init__文件中添加如下代码:
import pymysql
pymysql.install_as_MySql()
19周 13章   django ORM  基本操作 增、删、改、查
1、先导入模块
from app01 import models
    创建
    models.UserInfo.objects.create(username='root',password='123',)
    obj=models.UserInfo(username='bob',password='456')
    obj.save()
    dic={'username':'jack','password':'789'}
    models.UserInfo.objects.create(dic)
    查
    result=models.UserInfo.objects.all()
    result=models.UserInfo.objects.filter(username='root',password=999)
    拿到的是一个对象,而且是名字、密码都一样的第一个
    obj=models.UserInfo.objects.filter(username=u,password=p).first()
    
    取对象中的某一个数据
    obj=models.UserInfo.objects.filter(id=3).first()
    print(obj.username)
    
    拿到的是一个列表,而且是名字、密码都一样的多个
    obj=models.UserInfo.objects.filter(username=u,password=p)
    循环拿列表中的某一个数据:
def orm(request):
obj=models.UserInfo.objects.filter(id=3)
    for i in obj:
        print(i.username)
    return HttpResponse('orm')
    
    删除:
    models.UserInfo.objects.filter().delete()
    更新
    models.UserInfo.objects.all().update(password=888)
    models.UserInfo.objects.filter(id=1).update(password=999
第19章\urls.py
urlpatterns = [
    url(r'^cmdb/',include("app01.urls")),
    url(r'^monitor/',include("app02.urls")),
    ]
app01\views.py
from app01 import models
def orm(request):
    创建
    models.UserInfo.objects.create(username='root',password='123',)
    obj=models.UserInfo(username='bob',password='456')
    obj.save()
    dic={'username':'jack','password':'789'}
    models.UserInfo.objects.create(dic)
    查
    result=models.UserInfo.objects.all()
    result=models.UserInfo.objects.filter(username='root',password=999)
    
    删除:
    models.UserInfo.objects.filter().delete()
    更新
    models.UserInfo.objects.all().update(password=888)
    models.UserInfo.objects.filter(id=1).update(password=999
第19章 14节 基于ORM实现用户登录:
报错问题:
1、访问页面没有内容,返回200错误,说明肯定是html里面的内容写错了
2、ValueError: not enough values to unpack (expected 2, got 1)     
    
   这个错误说明:obj=models.UserInfo.objects.filter(id=nid).first()  这个里面没有写“id=” 
   
   或者:{'obj':obj}  这个写错了  
   总之是括号里面的少个东西
3、url一定要写成这样格式,否则很容易报错
   url(r'^userdetail-(?P<nid>\d+)/', views.user_detail,),
过程:
app01/urls.py
"""第19章 URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from app01 import views
from django.conf.urls import url
urlpatterns = [
    path('login/', views.login),
    path('index/', views.index,),
    path('user_info/', views.user_info,),
    url(r'^userdetail-(?P<nid>\d+)/', views.user_detail,),
    path('orm/', views.orm),
    ]
app01/views.py
from django.shortcuts import render
from django.shortcuts import HttpResponse
from django.shortcuts import redirect
import urllib
# Create your views here.
# USER_DICT={
#     'k1':'root1',
#     'k2':'root2',
#     'k3':'root3',
#     'k4':'root4',
# }
USER_DICT={
    '1':{'name':'root1','email':'root@123.com'},
    '2':{'name':'root2','email':'root@123.com'},
    '3':{'name':'root3','email':'root@123.com'},
    '4':{'name':'root4','email':'root@123.com'}
}
def index(request):
    return render(request,'index.html')
def user_info(request):
    user_list=models.UserInfo.objects.all()
    #print(user_list.query)
    return render(request,'user_info.html',{'user_list':user_list})
def user_detail(request,nid):
    obj=models.UserInfo.objects.filter(id=nid).first()
    return render(request,'user_detail.html',{'obj':obj})
def login(request):
    if request.method=="GET":
        return render(request,'login.html')
    elif request.method=="POST":
        #数据库中执行 select 判断用户名和密码是否中确
        u=request.POST.get('user')
        p=request.POST.get('pwd')
        #count=models.UserInfo.objects.filter(username=u,password=p).count() 也可以,但是不经常用
        obj=models.UserInfo.objects.filter(username=u, password=p).first()
        #print(obj)
        #下面意思:如果obj为真
        if obj:
            return redirect('/cmdb/index/')
        else:
            return render(request,'login.html')
    else:
        return redirect('/index/')
from app01 import models
def orm(request):
    #创建
    #models.UserInfo.objects.create(username='root',password='123',)
    # obj=models.UserInfo(username='bob',password='456')
    # obj.save()
    # dic={'username':'jack','password':'789'}
    # models.UserInfo.objects.create(dic)
    #查
    result=models.UserInfo.objects.all()
    #result=models.UserInfo.objects.filter(username='root',password=999)
    #
    #删除:
    #models.UserInfo.objects.filter().delete()
    #更新
    #models.UserInfo.objects.all().update(password=888)
    # obj=models.UserInfo.objects.filter(id=3)
    # for i in obj:
    #     print(i.username)
    #
    return HttpResponse('orm')
# from django.views import View
#
# class Home(View):
#     def dispatch(self, request, *args, **kwargs):
#         print('before')#kkkk
#         result=super(Home,self).dispatch(request, *args, **kwargs)
#         print('after')
#         return result
#
#     def get(self,request):
#         print(request.method)
#         return render(request,'home.html')
#     def post(self,request):
#         print(request.method)
#         return render(request,'home.html')
templates/login.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="提交">
    </form>
</body>
</html>
templates/index.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">
    欢迎到来
    </div>
    <div>
        <div style="position: absolute;top: 48px;bottom: 0;left: 0;width: 200px;background-color: aquamarine">
            <a class="menu" href="/cmdb/user_info/">用户管理</a>
            <a class="menu" href="/cmdb/user_group/">用户组管理</a>
        </div>
    </div>
    <div style="position: absolute;top: 48px;bottom: 0;left: 210px;width: 0;overflow: auto">
    </div>
</body>
</html>
templates/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">
    欢迎到来
    </div>
    <div>
        <div style="position: absolute;top: 48px;bottom: 0;left: 0;width: 200px;background-color: aquamarine">
            <a class="menu" href="/cmdb/user_info/">用户管理</a>
            <a class="menu" href="/cmdb/user_group/">用户组管理</a>
        </div>
    </div>
    <div style="position: absolute;top: 48px;bottom: 0;left: 210px;width: 700px;overflow: auto;background-color: antiquewhite">
        <h3>用户列表</h3>
        <ul>
            {% for row in user_list %}
                <li><a href="/cmdb/userdetail-{{ row.id }}/">{{ row.username }}</a></li>
            {% endfor %}
        </ul>
    </div>
</body>
</html>
templates/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">
    欢迎到来
    </div>
    <div>
        <div style="position: absolute;top: 48px;bottom: 0;left: 0;width: 200px;background-color: aquamarine">
            <a class="menu" href="/cmdb/user_info/">用户管理</a>
            <a class="menu" href="/cmdb/user_group/">用户组管理</a>
        </div>
    </div>
    <div style="position: absolute;top: 48px;bottom: 0;left: 210px;width: 700px;overflow: auto;background-color: antiquewhite">
        <h1>用户详细信息</h1>
        <h2>{{ obj.id }}</h2>
        <h2>{{ obj.name }}</h2>
        <h2>{{ obj.password }}</h2>
    </div>
</body>
</html>
19周-15章python基于 Django 基于ORM实现用户增加、删除、修改、查看
models.Business.objects.all()
是个对象
models.Business.objects.values('id','caption')
#[{'id':'1','caption':'运维','code':'sa'}] values 是个字典
models.Business.objects.values_list('id','caption')
#[(1,运维),(2,市场)]  values_list 是个元组
1、
注意:method="post"  一定要写。一定是小写  否则报错
<form action="/cmdb/user_info/" method="post">
2、
注意href和action、return redirect三个的区分,容易混淆
这是做的跳转:
<a class="menu" href="/cmdb/user_info/">用户管理</a> 
      
这是提交的当前的页面:
<form method="post" action="/cmdb/useredit-{{ obj.id }}/">
这个不加html
return redirect用法:不加html
return redirect('/cmdb/index/')
3、
根据id删除用户的瞬间跳转到当前页面
<a href="/cmdb/userdel-{{ row.id }}/"> 删除 </a>
def user_del(request,nid):
    models.UserInfo.objects.filter(id=nid).delete()
    return redirect('/cmdb/user_info/')
4、
注意不成功的话  重新打开一个页面试试
5、
注意:<input type="text" name="id" value="1"/>    value的意思是可以在输入框中显示出来id
style="display: none"
6、
注意form表单里面action路径 一定要和 url里面的保持一致,否则报错,
例如:
href="/cmdb/userdetail-{{ row.id }}   
url(r'^userdetail-(?P<nid>\d+)/', views.user_detail,),
app01/urls.py
"""第19章 URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from app01 import views
from django.conf.urls import url
urlpatterns = [
    path('login/', views.login),
    path('index/', views.index,),
    path('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,),
    path('orm/', views.orm),
    ]
app01/views.py
from django.shortcuts import render
from django.shortcuts import HttpResponse
from django.shortcuts import redirect
from app01 import models
import urllib
# Create your views here.
# USER_DICT={
#     'k1':'root1',
#     'k2':'root2',
#     'k3':'root3',
#     'k4':'root4',
# }
USER_DICT={
    '1':{'name':'root1','email':'root@123.com'},
    '2':{'name':'root2','email':'root@123.com'},
    '3':{'name':'root3','email':'root@123.com'},
    '4':{'name':'root4','email':'root@123.com'}
}
def index(request):
    return render(request,'index.html')
def user_info(request):
    if request.method=="GET":
        user_list=models.UserInfo.objects.all()
        return render(request,'user_info.html',{'user_list':user_list})
    elif request.method=="POST":
        u=request.POST.get('user')
        p=request.POST.get('pwd')
        models.UserInfo.objects.create(username=u,password=p)
        user_list=models.UserInfo.objects.all()
    #print(user_list.query)
        return render(request,'user_info.html',{'user_list':user_list})
def user_del(request,nid):
    models.UserInfo.objects.filter(id=nid).delete()
    return redirect('/cmdb/user_info/')
def user_edit(request,nid):
    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_detail/')
def user_detail(request,nid):
    obj=models.UserInfo.objects.filter(id=nid).first()
    return render(request,'user_detail.html',{'obj':obj})
def login(request):
    #models.UserGroup.objects.create(caption='DBA')
    if request.method=="GET":
        return render(request,'login.html')
    elif request.method=="POST":
        #数据库中执行 select 判断用户名和密码是否中确
        u=request.POST.get('user')
        p=request.POST.get('pwd')
        #count=models.UserInfo.objects.filter(username=u,password=p).count() 也可以,但是不经常用
        obj=models.UserInfo.objects.filter(username=u,password=p).first()
        #print(obj)
        #下面意思:如果obj为真
        if obj:
            return redirect('/cmdb/index/')
        else:
            return render(request,'login.html')
    else:
        return redirect('/index/')
def orm(request):
    #创建
    #models.UserInfo.objects.create(username='root',password='123',)
    # obj=models.UserInfo(username='bob',password='456')
    # obj.save()
    # dic={'username':'jack','password':'789'}
    # models.UserInfo.objects.create(dic)
    #查
    result=models.UserInfo.objects.all()
    #result=models.UserInfo.objects.filter(username='root',password=999)
    #
    #删除:
    #models.UserInfo.objects.filter().delete()
    #更新
    #models.UserInfo.objects.all().update(password=888)
    # obj=models.UserInfo.objects.filter(id=3)
    # for i in obj:
    #     print(i.username)
    #
    return HttpResponse('orm')
# from django.views import View
#
# class Home(View):
#     def dispatch(self, request, *args, **kwargs):
#         print('before')#kkkk
#         result=super(Home,self).dispatch(request, *args, **kwargs)
#         print('after')
#         return result
#
#     def get(self,request):
#         print(request.method)
#         return render(request,'home.html')
#     def post(self,request):
#         print(request.method)
#         return render(request,'home.html')
templates/index.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">
    欢迎到来
    </div>
    <div>
        <div style="position: absolute;top: 48px;bottom: 0;left: 0;width: 200px;background-color: aquamarine">
            <a class="menu" href="/cmdb/user_info/">用户管理</a>
            <a class="menu" href="/cmdb/user_group/">用户组管理</a>
        </div>
    </div>
    <div style="position: absolute;top: 48px;bottom: 0;left: 210px;width: 0;overflow: auto">
    </div>
</body>
</html>
templates/login.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="提交">
    </form>
</body>
</html>
templates/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">
    欢迎到来
</div>
<div>
    <div style="position: absolute;top: 48px;bottom: 0;left: 0;width: 200px;background-color: aquamarine">
        <a class="menu" href="/cmdb/user_info/">用户管理</a>
        <a class="menu" href="/cmdb/user_group/">用户组管理</a>
    </div>
</div>
<div style="position: absolute;top: 48px;bottom: 0;left: 210px;width: 700px;overflow: auto;background-color: antiquewhite">
    <h3>添加用户</h3>
    <form action="/cmdb/user_info/" method="post">
        <input type="text" name="user"/>
        <input type="text" name="pwd"/>
        <input type="submit" value="添加"/>
    </form>
    <h3>用户列表</h3>
    <ul>
        {% for row in user_list %}
            <li><a href="/cmdb/userdetail-{{ row.id }}/">{{ row.username }} </a> |
            <a href="/cmdb/userdel-{{ row.id }}/"> 删除 </a> |
            <a href="/cmdb/useredit-{{ row.id }}/"> 编辑 </a>
            </li>
        {% endfor %}
    </ul>
</div>
</body>
</html>
templates/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">
    欢迎到来
    </div>
    <div>
        <div style="position: absolute;top: 48px;bottom: 0;left: 0;width: 200px;background-color: aquamarine">
            <a class="menu" href="/cmdb/user_info/">用户管理</a>
            <a class="menu" href="/cmdb/user_group/">用户组管理</a>
        </div>
    </div>
    <div style="position: absolute;top: 48px;bottom: 0;left: 210px;width: 700px;overflow: auto;background-color: antiquewhite">
        <h1>用户详细信息</h1>
        <h2>{{ obj.id }}</h2>
        <h2>{{ obj.name }}</h2>
        <h2>{{ obj.password }}</h2>
    </div>
</body>
</html>
templates/user_edit.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>编辑用户</h1>
    <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" name="提交" >
    </form>
</body>
</html>
19周 16章   Django 字段类型介绍
字符串、数字、时间、二进制、自增
# Create your models here.
class UserGroup(models.Model):
    uid=models.AutoField(primary_key=True)
    caption=models.CharField(max_length=50)
class UserInfo(models.Model):
    #自动创建 id列  自增主键
    username=models.CharField(max_length=32)
    password=models.CharField(max_length=60)
    email=models.CharField(max_length=60)
    #gender=models.CharField(max_length=60,null=True)
    test=models.EmailField(max_length=20,null=True)
更新表:
password=models.CharField(max_length=60)
make manage.py makemigrations
make manage.py migrate
 
增加表:
1、
email=models.CharField(max_length=60)
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 2) Quit, and let me add a default in models.py
Select an option: 1
Please enter the default value now, as valid Python
The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now
Type 'exit' to exit this prompt
Invalid input: name 'jack' is not defined
>>> 'bob'
make manage.py makemigrations
make manage.py migrate
然后关掉软件,重新打开才生效。
2、、
gender=models.CharField(max_length=60,null=True)
   make manage.py makemigrations
   make manage.py migrate
 
删除表:
#gender=models.CharField(max_length=60,null=True)
make manage.py makemigrations
   make manage.py migrate
自增:
class UserGroup(models.Model):
    uid=models.AutoField(primary_key=True)
    caption=models.CharField(max_length=50)
19周 17章:Django ORM字段参数介绍: 这些都是在Django admin里面使用
    null                数据库中字段是否可以为空
    db_column           数据库中字段的列名
    db_tablespace
    default             数据库中字段的默认值
    primary_key         数据库中字段是否为主键
    db_index            数据库中字段是否可以建立索引
    unique              数据库中字段是否可以建立唯一索引
    unique_for_date     数据库中字段【日期】部分是否可以建立唯一索引
    unique_for_month    数据库中字段【月】部分是否可以建立唯一索引
    unique_for_year     数据库中字段【年】部分是否可以建立唯一索引
    verbose_name        Admin中显示的字段名称
    blank               Admin中是否允许用户输入为空   
            
            username=models.CharField(max_length=50,blank=True,verbose_name='用户名')
    editable            Admin中是否可以编辑
    help_text           Admin中该字段的提示信息
    choices             Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
                        如:gf = models.IntegerField(choices=[(0, '何穗'),(1, '大表姐'),],default=1)
    error_messages      自定义错误信息(字典类型),从而定制想要显示的错误信息;
                        字典健:null, blank, invalid, invalid_choice, unique, and unique_for_date
                        如:{'null': "不能为空.", 'invalid': '格式错误'}
    validators          自定义错误验证(列表类型),从而定制想要的验证规则
               
    auto_now
        uptime=models.DateTimeField(auto_now=True,null=True)
        自动更新时间:
        错误方式;
        obj=UserGroup.objects.filter(id=1).update(caption='CEO')
        正确方式;
        obj=UserGroup.objects.filter(id=1).first()
            obj.caption="CEO"
            obj.save()
     choices  :用在admin
               user_type_id=models.IntegerField(choices=user_type_choice,default=1)
          user_type_choice=(
            (1,'超级用户'),
            (2,'白金客户'),
            (3,'普通客户'),
        )
            user_type_id=models.IntegerField(choices=user_type_choice,default=1)
19周 18章:Django ORM外键操作
外键的意思:
主要作用就是把两个数据库表连接起来,比如把员工组表、员工信息表给连接起来
注意python3.7外键的变化:
user_group=models.ForeignKey("UserGroup",to_field='uid',default=1,on_delete=models.CASCADE)
注意:怎么取里面的值
row.user_group 是个对象
user_list=Userinfo.object.all()
for row in user_list:
    print(row.user_group_id) = print(row.user_group.uid)
        print(row.user_group.caption)
<ul>
            {% for row in user_list %}
                <li><a href="/cmdb/userdetail-{{ row.id }}/">{{ row.username }}</a>
                <span>{{ row.user_group.caption }}</span>
                </li>
            {% endfor %}
</ul>
实例:接之前的,变动的如下:
app01/models.py
from django.db import models
# Create your models here.
class UserGroup(models.Model):
    uid=models.AutoField(primary_key=True)
    caption=models.CharField(max_length=50)
    ctime=models.DateTimeField(auto_now_add=True,null=True)
    uptime=models.DateTimeField(auto_now=True,null=True)
    #username=models.CharField(max_length=50,blank=True)
class UserInfo(models.Model):
    #自动创建 id列  自增主键
    username=models.CharField(max_length=32)
    password=models.CharField(max_length=60)
    email=models.CharField(max_length=60)
    #gender=models.CharField(max_length=60,null=True)
    test=models.EmailField(max_length=20,null=True)
    username=models.CharField(max_length=50,blank=True,verbose_name='用户名')
    user_group=models.ForeignKey("UserGroup",to_field='uid',default=1,on_delete=models.CASCADE)
    user_type_choice=(
        (1,'超级用户'),
        (2,'白金客户'),
        (3,'普通客户'),
    )
    user_type_id=models.IntegerField(choices=user_type_choice,default=1)
templates/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">
    欢迎到来
</div>
<div>
    <div style="position: absolute;top: 48px;bottom: 0;left: 0;width: 200px;background-color: aquamarine">
        <a class="menu" href="/cmdb/user_info/">用户管理</a>
        <a class="menu" href="/cmdb/user_group/">用户组管理</a>
    </div>
</div>
<div style="position: absolute;top: 48px;bottom: 0;left: 210px;width: 700px;overflow: auto;background-color: antiquewhite">
    <h3>添加用户</h3>
    <form action="/cmdb/user_info/" method="post">
        <input type="text" name="user"/>
        <input type="text" name="pwd"/>
        <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>
</body>
</html>
第19章/urls.py
"""第19章 URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from app01 import views
from django.conf.urls import url
from django.conf.urls import url,include
import urllib
urlpatterns = [
    path('login/', views.login),
    path('index/', views.index,),
    path('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,),
    path('orm/', views.orm),
    ]
19周 19章:  外键实现增加用户(含select标签)
注意下面多个是这么写:弄得好苦
return render(request,'user_info.html',{'user_list':user_list,"group_list":group_list})
app01/views.py
from django.shortcuts import render
from django.shortcuts import HttpResponse
from django.shortcuts import redirect
from app01 import models
import urllib
# Create your views here.
# USER_DICT={
#     'k1':'root1',
#     'k2':'root2',
#     'k3':'root3',
#     'k4':'root4',
# }
USER_DICT={
    '1':{'name':'root1','email':'root@123.com'},
    '2':{'name':'root2','email':'root@123.com'},
    '3':{'name':'root3','email':'root@123.com'},
    '4':{'name':'root4','email':'root@123.com'}
}
def index(request):
    return render(request,'index.html')
def user_info(request):
    if request.method=="GET":
        user_list=models.UserInfo.objects.all()
        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)
        user_list=models.UserInfo.objects.all()
    #print(user_list.query)
        return render(request,'user_info.html',{'user_list':user_list})
def user_del(request,nid):
    models.UserInfo.objects.filter(id=nid).delete()
    return redirect('/cmdb/user_info/')
def user_edit(request,nid):
    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_detail/')
def user_detail(request,nid):
    obj=models.UserInfo.objects.filter(id=nid).first()
    return render(request,'user_detail.html',{'obj':obj})
def login(request):
    #models.UserGroup.objects.create(caption='DBA')
    if request.method=="GET":
        return render(request,'login.html')
    elif request.method=="POST":
        #数据库中执行 select 判断用户名和密码是否中确
        u=request.POST.get('user')
        p=request.POST.get('pwd')
        #count=models.UserInfo.objects.filter(username=u,password=p).count() 也可以,但是不经常用
        obj=models.UserInfo.objects.filter(username=u,password=p).first()
        #print(obj)
        #下面意思:如果obj为真
        if obj:
            return redirect('/cmdb/index/')
        else:
            return render(request,'login.html')
    else:
        return redirect('/index/')
def orm(request):
    #创建
    #models.UserInfo.objects.create(username='root',password='123',)
    # obj=models.UserInfo(username='bob',password='456')
    # obj.save()
    # dic={'username':'jack','password':'789'}
    # models.UserInfo.objects.create(dic)
    #查
    result=models.UserInfo.objects.all()
    #result=models.UserInfo.objects.filter(username='root',password=999)
    models.UserInfo.objects.create(
        username='root1',
        password=123,
        email='123@.com',
        test='ceshi',
        user_group_id=1,
    )
    #删除:
    #models.UserInfo.objects.filter().delete()
    #更新
    #models.UserInfo.objects.all().update(password=888)
    # obj=models.UserInfo.objects.filter(id=3)
    # for i in obj:
    #     print(i.username)
    #
    return HttpResponse('orm')
# from django.views import View
#
# class Home(View):
#     def dispatch(self, request, *args, **kwargs):
#         print('before')#kkkk
#         result=super(Home,self).dispatch(request, *args, **kwargs)
#         print('after')
#         return result
#
#     def get(self,request):
#         print(request.method)
#         return render(request,'home.html')
#     def post(self,request):
#         print(request.method)
#         return render(request,'home.html')
app01/models.py
from django.db import models
# Create your models here.
class UserGroup(models.Model):
    uid=models.AutoField(primary_key=True)
    caption=models.CharField(max_length=50)
    ctime=models.DateTimeField(auto_now_add=True,null=True)
    uptime=models.DateTimeField(auto_now=True,null=True)
    #username=models.CharField(max_length=50,blank=True)
class UserInfo(models.Model):
    #自动创建 id列  自增主键
    username=models.CharField(max_length=32)
    password=models.CharField(max_length=60)
    email=models.CharField(max_length=60)
    #gender=models.CharField(max_length=60,null=True)
    test=models.EmailField(max_length=20,null=True)
    username=models.CharField(max_length=50,blank=True,verbose_name='用户名')
    user_group=models.ForeignKey("UserGroup",to_field='uid',default=1,on_delete=models.CASCADE)
    user_type_choice=(
        (1,'超级用户'),
        (2,'白金客户'),
        (3,'普通客户'),
    )
    user_type_id=models.IntegerField(choices=user_type_choice,default=1)
app01/urls.py
"""第19章 URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from app01 import views
from django.conf.urls import url
from django.conf.urls import url,include
import urllib
urlpatterns = [
    path('login/', views.login),
    path('index/', views.index,),
    path('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,),
    path('orm/', views.orm),
    ]
templates/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">
    欢迎到来
</div>
<div>
    <div style="position: absolute;top: 48px;bottom: 0;left: 0;width: 200px;background-color: aquamarine">
        <a class="menu" href="/cmdb/user_info/">用户管理</a>
        <a class="menu" href="/cmdb/user_group/">用户组管理</a>
    </div>
</div>
<div style="position: absolute;top: 48px;bottom: 0;left: 210px;width: 700px;overflow: auto;background-color: antiquewhite">
    <h3>添加用户</h3>
    <form action="/cmdb/user_info/" method="post">
        <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>
</body>
</html>
templates/index.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">
    欢迎到来
    </div>
    <div>
        <div style="position: absolute;top: 48px;bottom: 0;left: 0;width: 200px;background-color: aquamarine">
            <a class="menu" href="/cmdb/user_info/">用户管理</a>
            <a class="menu" href="/cmdb/user_group/">用户组管理</a>
        </div>
    </div>
    <div style="position: absolute;top: 48px;bottom: 0;left: 210px;width: 0;overflow: auto">
    </div>
</body>
</html>
templates/login.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="提交">
    </form>
</body>
</html>
templates/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">
    欢迎到来
    </div>
    <div>
        <div style="position: absolute;top: 48px;bottom: 0;left: 0;width: 200px;background-color: aquamarine">
            <a class="menu" href="/cmdb/user_info/">用户管理</a>
            <a class="menu" href="/cmdb/user_group/">用户组管理</a>
        </div>
    </div>
    <div style="position: absolute;top: 48px;bottom: 0;left: 210px;width: 700px;overflow: auto;background-color: antiquewhite">
        <h1>用户详细信息</h1>
        <h2>{{ obj.id }}</h2>
        <h2>{{ obj.name }}</h2>
        <h2>{{ obj.password }}</h2>
    </div>
</body>
</html>
templates/user_edit.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>编辑用户</h1>
    <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" name="提交" >
    </form>
</body>
</html>
访问:
http://127.0.0.1:8000/cmdb/user_info/
第20章 03节  Django 一对多创建介绍
第20章 04节  Django 创建  一对多表结构
1、先创建一个工程
app01/models.py
from django.db import models
# Create your models here.
class Business(models.Model):
    caption=models.CharField(max_length=32)
class Host(models.Model):
    nid=models.AutoField(primary_key=True)
    hostname=models.CharField(max_length=32,db_index=True)
    ip=models.GenericIPAddressField(protocol="both",max_length=32,db_index=True)
    port=models.IntegerField()
    b=models.ForeignKey(to="Business",to_field='id',on_delete=models.CASCADE)
第20章-05    获取单表数据的三种方式
models.Business.objects.all()
是个对象
models.Business.objects.values('id','caption')
#[{'id':'1','caption':'运维','code':'sa'}] values 是个字典
models.Business.objects.values_list('id','caption')
#[(1,运维),(2,市场)]  values_list 是个元组
第20章/settings.py
"""
Django settings for 第20章 project.
Generated by 'django-admin startproject' using Django 2.0.3.
For more information on this file, see
https://docs.djangoproject.com/en/2.0/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.0/ref/settings/
"""
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'u#@z=2@*h^sph5$uqwo+gwgml#ivnq&l@b7-9jg8ve@pmv4z_6'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01',
]
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    #'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = '第20章.urls'
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
WSGI_APPLICATION = '第20章.wsgi.application'
# Database
# https://docs.djangoproject.com/en/2.0/ref/settings/#databases
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
# Password validation
# https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]
# Internationalization
# https://docs.djangoproject.com/en/2.0/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.0/howto/static-files/
STATIC_URL = '/static/'
STATICFILES_DIRS=(
    os.path.join(BASE_DIR,'static'),
)
app01/models.py
from django.db import models
# Create your models here.
class Business(models.Model):
    caption=models.CharField(max_length=32)
    code=models.CharField(max_length=32,null=True)
class Host(models.Model):
    nid=models.AutoField(primary_key=True)
    hostname=models.CharField(max_length=32,db_index=True)
    ip=models.GenericIPAddressField(protocol="both",max_length=32,db_index=True)
    port=models.IntegerField()
    b=models.ForeignKey(to="Business",to_field='id',on_delete=models.CASCADE)
第20章/urls.py
"""第20章 URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from app01 import views
from django.conf.urls import url
urlpatterns = [
    path('admin/', admin.site.urls),
    #path('business/', views.business,),
    url(r'^business/$', views.business,),
]
app01/views.py
from django.shortcuts import render
# Create your views here.
from app01 import models
def business(request):
    v1=models.Business.objects.all()
    v2=models.Business.objects.values('id','caption')
    #[{'id':'1','caption':'运维','code':'sa'}] values 对象是个字典
    v3=models.Business.objects.values_list('id','caption')
    #[(1,运维),(2,市场)]  values_list 对象是个元组
    return render(request,'business.html',{'v1':v1,'v2':v2,'v3':v3})
templates/business.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>业务线列表(对象)</h1>
    <ul>
        {% for row in v1 %}
        <li>{{ row.id }} - {{ row.caption }} - {{ row.code }}</li>
        {% endfor %}
    </ul>
    <h1>业务线列表(字典)</h1>
    <ul>
        {% for row in v2 %}
        <li>{{ row.id }} - {{ row.caption }} </li>
        {% endfor %}
    </ul>
    <h1>业务线列表(元组)</h1>
    <ul>
        {% for row in v3 %}
        <li>{{ row.0 }} - {{ row.1 }} </li>
        {% endfor %}
    </ul>
</body>
</html>
第20章-06    一对多跨表操作
实例接上面:
第20章/settings.py
"""
Django settings for 第20章 project.
Generated by 'django-admin startproject' using Django 2.0.3.
For more information on this file, see
https://docs.djangoproject.com/en/2.0/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.0/ref/settings/
"""
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'u#@z=2@*h^sph5$uqwo+gwgml#ivnq&l@b7-9jg8ve@pmv4z_6'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01',
]
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    #'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = '第20章.urls'
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
WSGI_APPLICATION = '第20章.wsgi.application'
# Database
# https://docs.djangoproject.com/en/2.0/ref/settings/#databases
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
# Password validation
# https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]
# Internationalization
# https://docs.djangoproject.com/en/2.0/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.0/howto/static-files/
STATIC_URL = '/static/'
STATICFILES_DIRS=(
    os.path.join(BASE_DIR,'static'),
)
app01/models.py
from django.db import models
# Create your models here.
class Business(models.Model):
    caption=models.CharField(max_length=32)
    code=models.CharField(max_length=32,null=True)
class Host(models.Model):
    nid=models.AutoField(primary_key=True)
    hostname=models.CharField(max_length=32,db_index=True)
    ip=models.GenericIPAddressField(protocol="both",max_length=32,db_index=True)
    port=models.IntegerField()
    b=models.ForeignKey(to="Business",to_field='id',on_delete=models.CASCADE)
第20章/urls.py
"""第20章 URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from app01 import views
from django.conf.urls import url
urlpatterns = [
    path('admin/', admin.site.urls),
    #path('business/', views.business,),
    url(r'^business/$', views.business,),
    url(r'^host/$', views.host,),
]
app01/views.py
from django.shortcuts import render,HttpResponse
# Create your views here.
from app01 import models
def business(request):
    v1=models.Business.objects.all()
    v2=models.Business.objects.values('id','caption')
    #[{'id':'1','caption':'运维','code':'sa'}] values 是个字典
    v3=models.Business.objects.values_list('id','caption')
    #[(1,运维),(2,市场)]  values_list 是个元组
    return render(request,'business.html',{'v1':v1,'v2':v2,'v3':v3})
def host(request):
    v1=models.Host.objects.filter(nid__gt=0)
    return render(request,'host.html',{'v1':v1})
templates/business.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>业务线列表(对象)</h1>
    <ul>
        {% for row in v1 %}
        <li>{{ row.id }} - {{ row.caption }} - {{ row.code }}</li>
        {% endfor %}
    </ul>
    <h1>业务线列表(字典)</h1>
    <ul>
        {% for row in v2 %}
        <li>{{ row.id }} - {{ row.caption }} </li>
        {% endfor %}
    </ul>
    <h1>业务线列表(元组)</h1>
    <ul>
        {% for row in v3 %}
        <li>{{ row.0 }} - {{ row.1 }} </li>
        {% endfor %}
    </ul>
</body>
</html>
templates/host.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>业务线列表</h1>
    <table border="1">
        <thead>
            <tr>
                <th>主机名</th>
                <th>ip地址</th>
                <th>端口</th>
                <th>业务线名称</th>
            </tr>
        </thead>
        <tbody>
            {% for row in v1 %}
            <tr ht_d="{{ row.nid }}" b_id="{{ row.b.id }}">
                <th>{{ row.hostname }}</th>
                <th>{{ row.ip }}</th>
                <th>{{ row.port }}</th>
                <th>{{ row.b.caption }}</th>
            </tr>
            {% endfor %}
        </tbody>
    </table>
</body>
</html>
第20周-07  一对多块表操作的三种方式
接上面:
app01/views.py
from django.shortcuts import render,HttpResponse
# Create your views here.
from app01 import models
def business(request):
    v1=models.Business.objects.all()
    # for row in v1:
    #     print(row.id,row.caption)
    v2=models.Business.objects.values('id','caption')
    # for row in v2:
    #     print(row['id'],row['caption'])
    #[{'id':'1','caption':'运维','code':'sa'}] values 是个字典
    v3=models.Business.objects.values_list('id','caption')
    #[(1,运维),(2,市场)]  values_list 是个元组
    return render(request,'business.html',{'v1':v1,'v2':v2,'v3':v3})
    #return HttpResponse('ok')
def host(request):
    v1=models.Host.objects.filter(nid__gt=0)
    # for row in v1:
    #     print(row.nid,row.hostname)
    v2=models.Host.objects.filter(nid__gt=0).values('nid','hostname','b_id','b__caption')
    # for row in v2:
    #     print(row['nid'],row['hostname'],row['b_id'])
    v3=models.Host.objects.filter(nid__gt=0).values_list('nid','hostname','b_id','b__caption')
    # for row in v3:
    #     print(row[0],row[1])
    #return HttpResponse('ok')
    return render(request,'host.html',{'v1':v1,'v2':v2,'v3':v3})
templates/host.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>主机列表(列表)</h1>
    <table border="1">
        <thead>
            <tr>
                <th>主机名</th>
                <th>ip地址</th>
                <th>端口</th>
                <th>业务线名称</th>
            </tr>
        </thead>
        <tbody>
        
            {% for row in v1 %}
            <tr ht-d="{{ row.nid }}" b-id="{{ row.b.id }}">
                <th>{{ row.hostname }}</th>
                <th>{{ row.ip }}</th>
                <th>{{ row.port }}</th>
                <th>{{ row.b.caption }}</th>
            </tr>
            {% endfor %}
        <tbody>
    </table>
    <h1>主机列表(字典)</h1>
    <table border="1">
        <thead>
            <tr>
                <th>主机名</th>
                <th>ip地址</th>
                <th>端口</th>
                <th>业务线名称</th>
            </tr>
        </thead>
        <tbody>
        
            {% for row in v1 %}
            <tr ht-d="{{ row.nid }}" b-id="{{ row.b.id }}">
                <th>{{ row.hostname }}</th>
                <th>{{ row.ip }}</th>
                <th>{{ row.port }}</th>
                <th>{{ row.b.caption }}</th>
            </tr>
            {% endfor %}
        <tbody>
    </table>
    <h1>业务线列表*(元组)</h1>
    <table border="1">
        <thead>
            <tr>
                <th>主机名</th>
                <th>ip地址</th>
            </tr>
        </thead>
        <tbody>
        
            {% for row in v3 %}
            <tr ht-d="{{ row.0 }}" b-id="{{ row.2 }}">
                <th>{{ row.1 }}</th>
                <th>{{ row.3 }}</th>
            </tr>
            {% endfor %}
        <tbody>
    </table>
</body>
</html>
第20周-09 增加一对多数据示例;  --添加主机--用模态对话框演示:
接上面:
app01/views.py
from django.shortcuts import render,HttpResponse,redirect
# Create your views here.
from app01 import models
def business(request):
    v1=models.Business.objects.all()
    # for row in v1:
    #     print(row.id,row.caption)
    v2=models.Business.objects.values('id','caption')
    # for row in v2:
    #     print(row['id'],row['caption'])
    #[{'id':'1','caption':'运维','code':'sa'}] values 是个字典
    v3=models.Business.objects.values_list('id','caption')
    #[(1,运维),(2,市场)]  values_list 是个元组
    return render(request,'business.html',{'v1':v1,'v2':v2,'v3':v3})
    #return HttpResponse('ok')
def host(request):
    if request.method=='GET':
        b_list=models.Business.objects.all()
    elif request.method=='POST':
        h=request.POST.get('hostname')
        i=request.POST.get('ip')
        p=request.POST.get('port')
        b=request.POST.get('b_id')
        models.Host.objects.create(hostname=h,ip=i,port=p,b_id=b)
        return redirect('/host/')
    v1=models.Host.objects.filter(nid__gt=0)
    # for row in v1:
    #     print(row.nid,row.hostname)
    v2=models.Host.objects.filter(nid__gt=0).values('nid','hostname','b_id','b__caption')
    # for row in v2:
    #     print(row['nid'],row['hostname'],row['b_id'])
    v3=models.Host.objects.filter(nid__gt=0).values_list('nid','hostname','b_id','b__caption')
    # for row in v3:
    #     print(row[0],row[1])
    #return HttpResponse('ok')
    return render(request,'host.html',{'v1':v1,'v2':v2,'v3':v3,'b_list':b_list})
templates/host.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .hide {
            display: none;
        }
        .shade {
            position: fixed;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
            background: black;
            opacity: 0.6;
            z-index: 100;
        }
        .add-modal {
            position: fixed;
            height: 300px;
            width: 400px;
            top: 100px;
            left: 50%;
            z-index: 101;
            border: 1px solid red;
            background: white;
            margin-left: -200px;
        }
    </style>
</head>
<body>
<h1>主机列表(列表)</h1>
<div>
    <input id="add_host" type="button" value="添加">
</div>
<table border="1">
    <thead>
    <tr>
        <th>序号</th>
        <th>主机名</th>
        <th>ip地址</th>
        <th>端口</th>
        <th>业务线名称</th>
    </tr>
    </thead>
    <tbody>
    {% for row in v1 %}
        <tr ht-d="{{ row.nid }}" b-id="{{ row.b.id }}">
            <th>{{ forloop.counter }}</th>
            <th>{{ row.hostname }}</th>
            <th>{{ row.ip }}</th>
            <th>{{ row.port }}</th>
            <th>{{ row.b.caption }}</th>
        </tr>
    {% endfor %}
    <tbody>
</table>
<h1>主机列表(字典)</h1>
<table border="1">
    <thead>
    <tr>
        <th>主机名</th>
        <th>ip地址</th>
        <th>端口</th>
        <th>业务线名称</th>
    </tr>
    </thead>
    <tbody>
    {% for row in v1 %}
        <tr ht-d="{{ row.nid }}" b-id="{{ row.b.id }}">
            <th>{{ row.hostname }}</th>
            <th>{{ row.ip }}</th>
            <th>{{ row.port }}</th>
            <th>{{ row.b.caption }}</th>
        </tr>
    {% endfor %}
    <tbody>
</table>
<h1>主机列表*(元组)</h1>
<table border="1">
    <thead>
    <tr>
        <th>主机名</th>
        <th>ip地址</th>
    </tr>
    </thead>
    <tbody>
    {% for row in v3 %}
        <tr ht-d="{{ row.0 }}" b-id="{{ row.2 }}">
            <th>{{ row.1 }}</th>
            <th>{{ row.3 }}</th>
        </tr>
    {% endfor %}
    <tbody>
</table>
<div class="shade hide"></div>
<div class="add-modal hide">
    <form method="post" action="/host/">
        <div class="group">
            <input type="text" placeholder="主机名" name="hostname">
        </div>
        <div class="group">
            <input type="text" placeholder="IP" name="ip">
        </div>
        <div class="group">
            <input type="text" placeholder="端口" name="port">
        </div>
        <div class="group">
            <select name="b_id">
                {% for op in b_list %}
                <option value="{{ op.id }}">{{ op.caption }}</option>
                {% endfor %}
            </select >
            <input type="submit" value="提交">
            <input id="cancle" type="button" value="取消">
        </div>
    </form>
</div>
<script src="/static/jquery-3.2.1.js"></script>
<script>
    $(function () {
        $('#add_host').click(function () {
            $('.add-modal,.shade').removeClass('hide');
        });
        $('#cancle').click(function(){
            $('.add-modal,.shade').addClass('hide');
        })
    })
</script>
</body>
</html>