- 上传文件示例(html)
- fbc和cbv
- html获取字典(keys,values)
- django路由系统
- django路由系统(url正则表达式)
- django路由转发(include)
- django数据库
- django数据库字段参数
- 关联表
- request,POST.GET.FILES方法
- django数据库增删改查
- 数据库类型
- 循环生成序列号
- Ajax
- 数据库表多对多
1.上传文件示例(html)login.html
login.html
from django.shortcuts import render import os # Create your views here. from django.shortcuts import HttpResponse from django.shortcuts import render,redirect from django.core.files.uploadedfile import InMemoryUploadedFile def login(request): if request.method == "GET": return render(request,'login.html') elif request.method == "POST": # v = request.POST.get('gender') 获取单选 # print(v) # v = request.POST.getlist('favor') 获取多选(list) # print(v) # v = request.POST.get('fafafa') # print(v) obj = request.FILES.get('fafafa') 获取文件 print(obj,type(obj),obj.name) file_path = os.path.join('upload',obj.name) f = open(file_path,mode='wb') for i in obj.chunks(): f.write(i) f.close() return render(request,'login.html') else: return redirect('/index/')
<body> <form action="/login/" method="POST" enctype="multipart/form-data"> #上传文件 <p> <input type="text" name="user" placeholder="用户名" /> </p> <p> <input type="password" name="pwd" placeholder="密码"/> </p> <p> 男:<input type="radio" name="gender" value="1"/> 女:<input type="radio" name="gender" value="2"/> 二:<input type="radio" name="gender" value="3"/> </p> <p> 男:<input type="checkbox" name="favor" value="11"/> 女:<input type="checkbox" name="favor" value=22"/> 二:<input type="checkbox" name="favor" value="33"/> </p> <p> <select name="city" multiple> #多选 <option value="sh">上海</option> <option value="bj">北京</option> <option value="ti">天津</option> </select> </p> <p> <input type="file" name="fafafa" /> </p> <input type="submit" value="提交" /> </form> </body> </html>
views.py
from django.contrib import admin from django.urls import path from django.conf.urls import url from cmdb import views urlpatterns = [ # path('admin/', admin.site.urls), url(r'login/',views.login), #fbv url(r'home/', views.Home.as_view()) #cbv ]
templateshome.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/home/" method="POST"> <input type="text" name="user"/> <input type="submit"/> </form> </body> </html>
cmdbviews.py
from django.views import View class Home(View): def dispatch(self,request, *args, **kwargs): #调用父类中的dispatch print('before') 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,"POST") return render(request,'home.html')
html获取字典(keys,values)
login.html <body> <ul> {% for k in user_dict.keys %} <li>{{ k }}</li> {% endfor %} </ul> <ul> {% for k in user_dict.values %} <li>{{ k }}</li> {% endfor %} </ul> <ul> {% for k,row in user_dict.items %} <li>{{ k }}-{{ row }}</li> {% endfor %} </ul> </body> viewa.py USER_DICT = { 'k1':'root1', 'k2':'root2', 'k3':'root3', 'k4':'root4', } def index(request): return render(request, 'index.html',{'user_dict' : USER_DICT})
django路由系统(url正则表达式)
1,url(r'^index/',views.index), url(r'^home/',views.Home.as_view()), {% for k,row in user_list.items %} <li><a target="_blank" href="/detail/?nid={{ k }}">{{ row.name }} </a></li> {% endfor %} 2,url(r'^detail-(d+).html',views.detail), {% for k,row in user_list.items %} <li><a target="_blank" href="/detail-{{ k }}.html">{{ row.name }} </a></li> {% endfor %} url(r'^detail-(?p<nid>d+)-(?p<uid>d+).html', views.detail) def detail(request, *args,kwargs): pass
django路由转发(include)
url.py
url(r'^asd/', views.index, name='i1'), url(r'^yug/(d+)/(d+)/', views.index, name='i2'), url(r'^buy/(?p<pid>d+)/(?p<nid>d+)/', views.index, name='i3'),
xxx.html
{% url 'i1' %} #asd/ {% url 'i2' 1 2 %} #yug/1/2/ {% url 'i3' pid=1 nid=9 %} #buy/1/9/
views(from django.urls import reverse 自动生成URL)
def func(request, *args, **kwargs): from diango.urls import reverse url1 = reverse('i1') # asd/ url2 = reverse('i2',args=(1,2,)) # yug/1/2/ url3 = reverse('i3', kwargs={'pid':1, "nid": 9}) # buy/1/9/
phicomm/urls.py
from django.contrib import admin from django.urls import path from django.conf.urls import url,include urlpatterns = [ # path('admin/', admin.site.urls), url(r'^cmdb/', include("app01.urls")), url(r'^monitor/', include("app02.urls")), ]
app01/urls.py
from app01 import views urlpatterns = [ url(r'^login/', views.login), ]
app01/views.py
from django.shortcuts import render,HttpResponse # Create your views here. def login(request): return HttpResponse('APP01,login')
django数据库
app01/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=32) 生成表记录 python manage.py makemigrations 创建表 python manage.py migrate
phicomm/settings.py
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01' ### ]
链接mysql
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'dbname', 'USER': 'root', 'PASSWORD': 'XXXX', 'HOST': '127.0.0.1', 'PORT': '3306', } }
import pymysql pymysql.install_as_MySQLdb()
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01' ] DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'abc', 'USER': 'test', 'PASSWORD': '123.com', 'HOST': '192.168.1.6', 'PORT': '3306', } } phicomm/urls.py urlpatterns = [ # path('admin/', admin.site.urls), url(r'^cmdb/', include("app01.urls")), url(r'^monitor/', include("app02.urls")), ] app01/urls.py from app01 import views urlpatterns = [ url(r'^login/', views.login), url(r'^orm/',views.orm),
from app01 import models def orm(request): #创建 #models.UserInfo.objects.create(username='root',password='123') # dic = {'username': 'test','password':'789'} # models.UserInfo.objects.create(**dic) # obj = models.UserInfo(username='zhang',password='123') # obj.save() #查 #result = models.UserInfo.objects.all() # result = models.UserInfo.objects.filter(username="root",id='1') # for row in result: # print(row.id,row.username,row.password) #删除 # models.UserInfo.objects.all(id='3').delete() # models.UserInfo.objects.filter(id='3').delete() #更新 models.UserInfo.objects.filter(id=4).update(password='6789') return HttpResponse('orm')
django数据库字段参数
class UserInfo(moldels.Model): # id列,自增,主键 # 用户名列,字符串类型,指定长度 # 字符串,数字,时间,二进制 username = models.CharField(max_length=32) password = models.CharField(max_length=60) email = models.CharField(max_length=60) test = models.EmailField(max-length=19,null=True) #test = models.URLField(max-length=19,null=True) #test = models.GenericIPAddressField()
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中是否允许用户输入为空 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 自定义错误验证(列表类型),从而定制想要的验证规则 from django.core.validators import RegexValidator from django.core.validators import EmailValidator,URLValidator,DecimalValidator, MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator 如: test = models.CharField( max_length=32, error_messages={ 'c1': '优先错信息1', 'c2': '优先错信息2', 'c3': '优先错信息3', }, validators=[ RegexValidator(regex='root_d+', message='错误了', code='c1'), RegexValidator(regex='root_112233d+', message='又错误了', code='c2'), EmailValidator(message='又错误了', code='c3'), ] ) 参数
null 是否可以为空 default 默认值 primary_key 主键 db_column 列名 db_index 索引 unique 唯一索引 unique_for_date unique_for_month unique_for_year auto_now 自动生成时间 auto_now_add 创建时自动生成时间 obj = UserGroup.objects.filter(id=1).update(caption='CEO') obj = UserGroup.objects.filter(id=1).first() obj.caption="CEO" obj.save() choices django admin中显示下拉框,避免链表查询 blank django admin是否可以为空 verbose_name django admin显示字段中文 editable django admin是否可以被编辑 error_messages 错误信息 help_text django admin提示 validators django admin自定义错误信息
class UserInfo(moldels.Model): # id列,自增,主键 # 用户名列,字符串类型,指定长度 # 字符串,数字,时间,二进制 username = models.CharField(max_length=32) password = models.CharField(max_length=60) email = models.CharField(max_length=60) test = models.EmailField(max-length=19,null=True,error_messages={'invalid':'请输入密码'}) user_type_choices = ( (1,'超级用户'), (2,'普通用户'), (3,'低级用户'), ) user_type_id = models.IntegerField(choices=user_type_choices,default=1) user_list = Userinfo.objects.all() for row in user_list: print(row.user_group_id) print(row.user_group.uid)
9.关联表
from django.db import models # Create your models here. class UserGroup(models.Model): uid = models.AutoField(primary_key=True) groupname = models.CharField(max_length=32) class UserInfo(models.Model): # id列,自增,主键 # 用户名列,字符串类型,指定长度 username = models.CharField(max_length=32,blank=True,verbose_name='用户名') password = models.CharField(max_length=32) # user_group = models.ForeignKey(UserGroup,to_field='uid',default=1) user_group_id = models.ForeignKey(to=UserGroup,to_field='uid',on_delete=models.CASCADE)
10.request,POST.GET.FILES方法
request.POST.get request.GET.get request.FILES.get() 获取文件 #checkbox, .........getlist() request.path_info 文件对象 = request.FILES.get() 文件对象. name 文件对象. size 文件对象. chunks() #<form 特殊的设置></form>
11.django数据库增删改查
增 models.User.objects.create(name='qiansanwan',age=18) dic = {'name':'xx', 'age': 19} midels.User.objects.create(**dic) obj = models.User(name='qiansanwan',age=18) obj.save() 删 models.User.objects.filter(id=1).delete() 改 moldes.User.objects.filter(id__gt=1).update(name='zhang',age=18) dic = {'name': 'xx','age': 19} models.User.objects.filter(id__gt=1).update(**dic) 查 moldes.User.objects.filter(id=1,name='root') moldes.User.objects.filter(id__gt=1,name='root') 大于 moldes.User.objects.filter(id__lt=1) 小于 moldes.User.objects.filter(id__gte=1) 大于等于 moldes.User.objects.filter(id__lte=1) 小于等于 moldes.User.objects.filter(id=1,name='root') dic={'name':'xx','age_gt': 19} moldes.User.objects.filter(**dic)
12.数据库类型
v1 = models.Business.objects.all() #QuerySet ,内部元素都是对象 #QuerySet ,内部元素都是字典 v1 = models.Business.objects.all().values('id','caption') #QuerySet ,内部元素都是元组 v1 = models.Business.objects.all().values_list('id','caption') #获取到的一个对象,如果不存在就报错 models.Business.objects.get(id=1) 对象或者None = models.Business.objects.filter(id=1).first()
13.循环生成序列号
{% for row in v1%} <td>{{forloop.counter}} <td/> {% endfor %}
14.Ajax
$.ajax({ url: '/host', type: "POST", data: {'K1': 123,'K2': 'root'}, success: function(data){ //data是服务器端返回的字符串 var obj = JSON.parse(data); } }) 建议:永远让服务器端返回一个字典 return HttpResponse(json.dumps(字典))
15.数据库表多对多
class Host(models.Model): nid = models.AutoField(primary_key=True) hostname = models.CharField(max_length=32,db_index=True) ip = models.GenericIPAddressField(protocol="ipv4",db_index=True) port = models.IntegerField() b = models.ForeignKey(to="Business", to_field='id') class Application(models.Model): name = models.CharField(max_length=32) class HostToApp(models.Model): hobj = models.ForeignKey(to=’Host‘,to_field='id') aobj = models.ForeignKey(to='Application','to_field='id') class Host(models.Model): nid = models.AutoField(primary_key=True) hostname = models.CharField(max_length=32,db_index=True) ip = models.GenericIPAddressField(protocol="ipv4",db_index=True) port = models.IntegerField() b = models.ForeignKey(to="Business", to_field='id') class Application(models.model): name = models.CharField(max_length=32) r = models.ManyToManyField("Host") 无法直接对第三张表直接进行操作 obj = Application.objects.get(id=1) obj.name 第三张表操作 obj.r.add(1) obj.r.add(2) obj.r.add(2,3,4) obj.r.add(*[1,2,3]) obj.r.remove(1) obj.r.remove(2,4) obj.r.remove(*[1,2,3]) 设置只保留3,5,7 obj.r.set([3,5,7])