一,django 知識總結html
1,同一個name屬性的標籤,多個值獲取python
<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> <from> view.py函數 v = request.POST.getlist('favor')
2,select 標籤多選mysql
<p> <select name="city" multiple> #select標籤添加multiple屬性 <option value="sh">上海</option> <option value="bj">北京</option> <option value="tj">天津</option> </select> </p>
3,文件上傳git
#form 表單中設置
<form action="/login/" method="POST" enctype="multipart/form-data">
view.py
obj = request.FILES.get('fafafa')
print(obj,type(obj),obj.name) import os file_path = os.path.join('upload', obj.name) f = open(file_path, mode="wb") for i in obj.chunks(): f.write(i) f.close()
4,模板語言循環操做字典正則表達式
view.py 中定義字典 USER_DICT = { 'k1': 'root1', 'k2': 'root2', 'k3': 'root3', 'k4': 'root4', } tamplates 中的html模板中讀取 {% for k,row in user_dict.items %} <li>{{ k }}-{{ row }}</li> {% endfor % }
5,tamplates 的html獲取字典中的值sql
html
1,跳轉html <li><a target="_blank" href="/detail-{{k}}.html」>{{ row.name }} </a></li>
2,跳轉後的html <h1> 詳細信息</h1> <h6>用戶名:{{ detail_info.name }}</h6> <h6>郵箱:{{ detail_info.email }}</h6> views.py函數 def detail(request,nid): detail_info = USER_DICT[nid] return render(request, 'detail.html', {'detail_info': detail_info})
url.py
url(r'^detail-(\d+).html', views.detail),
6,django url 正則匹配數據庫
(1)在django url 中傳參數,發送給後端的views.py中的處理函數,有時候會遇到傳多個參數的問題,例如 url(r'^detail-(\d+)-(\d+).html',views.detail), 在views.py函數中接收,def detail(request,nid,uid),函數定義中傳入多個形式參數,來接收url的變量,且變量的值和detail函數的參數位置是一致的,django
(2)在django url 中添加?P,肯定url中參數對應的變量名,這樣detail函數中定義的形式參數位置能夠任意放置後端
url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html',views.detail) def detail(request,uid,nid) def detail(request,nid,uid) #均可以自行接收本身的值
(3)wiews.y函數中接收多個參數 def detail(request,*args,**kwargs) *args是以元組的形式接收參數,**kwargs是以字典的形式接收參數session
總結
a. url中單個正則表達式 url(r'^detail-(\d+)-(\d+).html', views.detail), def func(request, nid, uid): pass def func(request, *args): args = (2,9) def func(request, *args, **kwargs): args = (2,9) b. url 中的正則表達式以key.value形式定義 url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail)
def func(request, nid, uid): pass def funct(request, **kwargs): kwargs = {'nid': 1, 'uid': 3} def func(request, *args, **kwargs): args = (2,9)
7,django url 中的name屬性,對URL路由關係進行命名
(1) 在url中能夠爲一個url設置一個別名 例如 ('r‘indexaaaabbbaa’,views.index,name="index")
(2) 在templates 的html中引用 <form action="{% url 'index' %}" method="POST"></form>
(3) <form action="{{ request.path_info }}" method="POST" ></form>提交完成以後跳轉本頁 ,path_info 獲取當前url
(4) 在 wiews.py函數中重寫url
from django.urls import reverse def index(request): v=reverse('indexx') print(v) #v爲生成的url,當url 中不含參數時例如url(r'index',index,name="indexx") def index(request,nid): v=reverse('indexx' args=(90,)) #當url 中含一個參數時例如url(r'index/(\d+)/',index,name="indexx")
def index(request,nid,vid):
v=reverse('indexx',args=(90,10,)) #當url 中含多個參數例如url(r'index/(\d+)/(\d+)/',index,name="indexx")
def index(request,nid,vid):
v=reverse('indexx',kwargs={'nid':1,'vid':10} #當url中含?P時例如url(r'index/(?P<nid>\d+)/(?P<uid>\d+)/',index,name="indexx")
#form 表單裏面傳值<form action="{% url 'index' nid=1 uid=3 %}" method="POST"></form>
(5)url分類,多個app url分發
在主程序django project 下的url 中添加app的url
url(r'^cmdb/',include("app01.urls")), #到app01中加載app01的urls文件
url(r'^monitor/',include("app02.urls")), #到app02中加載app02的urls文件
8,django ORM操做數據庫
1,建立數據庫
(1)建立類
from django.db import models # app01_userinfo class UserInfo(models.Model): # id列,自增,主鍵 username = models.CharField(max_length=32) # id列,自增,主鍵 password = models.CharField(max_length=64) # 用戶名列,字符串類型,指定長度
(2)註冊APP
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01', ]
(3)執行命令
python manage.py makemigrations python manage.py migrate
(4)注意
#Django默認使用MySQLdb模塊連接MySQL #主動修改成pymysql,在project同名文件夾下的__init__文件中添加以下代碼便可: #import pymysql #pymysql.install_as_MySQLdb()
2,數據寫入
方法一:
models.UserInfo.objects.create(username="root",password="123")
方法二:
dict = {'username':'eric','password':'123'}
models.UserInfo.objects.create(**dict)
方法三:
obj = models.UserInfo(username='jack',password='123')
obj.save()
3,數據查找
(1) 查取全部 result = models.UserInfo.objects.all()
result爲QuerySet類型,爲django的數據類型,能夠看作一個列表,表當中有多少條數據,列表中就有多少個元素,每一個元素其實就是一個obj對象,對象中包含 的內容就是表的每個字段,例如[obj(id,username,password),obj(id,username,password),obj(id,username,password)],最終的讀取能夠用以下代碼
for row in result: print(row.id,row.username,row.password)
(2)根據條件查值 result = models.UserInfo.object.filter(username='root')
result = models.UserInfo.object.filter(username='root',password='123') 至關於and username 和password
4,數據刪除
result = models.UserInfo.object.filter(username='root',password='123').delete()刪除此行數據
5,數據修改
result = models.UserInfor.object.filter(username='root',password='123').update(password="666")
6,數據操做其餘方法
models.UserInfo.object.filter(password='123').first() 找到第一個或者.count()統計個數
9,django admin 配置
(1)建立後臺管理員 python manage.py createsuperuser
(2)配置後臺管理url url(r'^admin/',admin.site.urls)
(3)註冊和配置django後臺管理頁面
1,打開admin.py,配置以下
from django.contrib import admin from app01 import models admin.site.register(models.UserType) admin.site.register(models.UserInfo) admin.site.register(models.UserGroup) admin.site.register(models.Asset)
2,設置數據表名稱
class UserType(models.Model): name = models.CharField(max_length=50) class Meta: verbose_name = '用戶類型' verbose_name_plural = '用戶類型'
10,django models 字段類型
總體包括五類:(1)字符串(2)數字(3)時間(4)二進制(5)自增類型
AutoField(Field) - int自增列,必須填入參數 primary_key=True
例如
class UserGroup:
uid = models.AutoField(primary_key=True) BigAutoField(AutoField) - bigint自增列,必須填入參數 primary_key=True 注:當model中若是沒有自增列,則自動會建立一個列名爲id的列 from django.db import models class UserInfo(models.Model): # 自動建立一個列名爲id的且爲自增的整數列 username = models.CharField(max_length=32) class Group(models.Model): # 自定義自增列 nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) SmallIntegerField(IntegerField): - 小整數 -32768 ~ 32767 PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField) - 正小整數 0 ~ 32767 IntegerField(Field) - 整數列(有符號的) -2147483648 ~ 2147483647 PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField) - 正整數 0 ~ 2147483647 BigIntegerField(IntegerField): - 長整型(有符號的) -9223372036854775808 ~ 9223372036854775807 自定義無符號整數字段 class UnsignedIntegerField(models.IntegerField): def db_type(self, connection): return 'integer UNSIGNED' PS: 返回值爲字段在數據庫中的屬性,Django字段默認的值爲: 'AutoField': 'integer AUTO_INCREMENT', 'BigAutoField': 'bigint AUTO_INCREMENT', 'BinaryField': 'longblob', 'BooleanField': 'bool', 'CharField': 'varchar(%(max_length)s)', 'CommaSeparatedIntegerField': 'varchar(%(max_length)s)', 'DateField': 'date', 'DateTimeField': 'datetime', 'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)', 'DurationField': 'bigint', 'FileField': 'varchar(%(max_length)s)', 'FilePathField': 'varchar(%(max_length)s)', 'FloatField': 'double precision', 'IntegerField': 'integer', 'BigIntegerField': 'bigint', 'IPAddressField': 'char(15)', 'GenericIPAddressField': 'char(39)', 'NullBooleanField': 'bool', 'OneToOneField': 'integer', 'PositiveIntegerField': 'integer UNSIGNED', 'PositiveSmallIntegerField': 'smallint UNSIGNED', 'SlugField': 'varchar(%(max_length)s)', 'SmallIntegerField': 'smallint', 'TextField': 'longtext', 'TimeField': 'time', 'UUIDField': 'char(32)', BooleanField(Field) - 布爾值類型 NullBooleanField(Field): - 能夠爲空的布爾值 CharField(Field) - 字符類型 - 必須提供max_length參數, max_length表示字符長度 TextField(Field) - 文本類型 EmailField(CharField): - 字符串類型,Django Admin以及ModelForm中提供驗證機制 IPAddressField(Field) - 字符串類型,Django Admin以及ModelForm中提供驗證 IPV4 機制 GenericIPAddressField(Field) - 字符串類型,Django Admin以及ModelForm中提供驗證 Ipv4和Ipv6 - 參數: protocol,用於指定Ipv4或Ipv6, 'both',"ipv4","ipv6" unpack_ipv4, 若是指定爲True,則輸入::ffff:192.0.2.1時候,可解析爲192.0.2.1,開啓刺功能,須要protocol="both" URLField(CharField) - 字符串類型,Django Admin以及ModelForm中提供驗證 URL SlugField(CharField) - 字符串類型,Django Admin以及ModelForm中提供驗證支持 字母、數字、下劃線、鏈接符(減號) CommaSeparatedIntegerField(CharField) - 字符串類型,格式必須爲逗號分割的數字 UUIDField(Field) - 字符串類型,Django Admin以及ModelForm中提供對UUID格式的驗證 FilePathField(Field) - 字符串,Django Admin以及ModelForm中提供讀取文件夾下文件的功能 - 參數: path, 文件夾路徑 match=None, 正則匹配 recursive=False, 遞歸下面的文件夾 allow_files=True, 容許文件 allow_folders=False, 容許文件夾 FileField(Field) - 字符串,路徑保存在數據庫,文件上傳到指定目錄 - 參數: upload_to = "" 上傳文件的保存路徑 storage = None 存儲組件,默認django.core.files.storage.FileSystemStorage ImageField(FileField) - 字符串,路徑保存在數據庫,文件上傳到指定目錄 - 參數: upload_to = "" 上傳文件的保存路徑 storage = None 存儲組件,默認django.core.files.storage.FileSystemStorage width_field=None, 上傳圖片的高度保存的數據庫字段名(字符串) height_field=None 上傳圖片的寬度保存的數據庫字段名(字符串) DateTimeField(DateField) - 日期+時間格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] DateField(DateTimeCheckMixin, Field) - 日期格式 YYYY-MM-DD TimeField(DateTimeCheckMixin, Field) - 時間格式 HH:MM[:ss[.uuuuuu]] DurationField(Field) - 長整數,時間間隔,數據庫中按照bigint存儲,ORM中獲取的值爲datetime.timedelta類型 FloatField(Field) - 浮點型 DecimalField(Field) - 10進制小數 - 參數: max_digits,小數總長度 decimal_places,小數位長度 BinaryField(Field) - 二進制類型
11 django models 字段的限制參數
null #db是否能夠爲空 =True default # 默認值 ="" primary_key #主鍵 =True db_column #列名 ="user" db_index #索引 =True unique #惟一索引 =True 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中顯示的下拉框,避免連表查詢 class UserInfo(models.Model): username = models.CharField(max_length=32) user_type_choices = ( (1,'超級用戶'), (2,'普通用戶'), (3,'普普通用戶'), ) user_type_id = models.IntegerField(choices=user_type_choices,default=1) blank #django admin是否能夠爲空 verbose_name #django admin顯示字段中文 editable #django admin是否能夠被編輯 error_messages #錯誤信 help_text #django admin提示 validators
12,django models外鍵設置
class UserGroup(models.Model): uid = models.AutoField(primary_key=True) caption = models.CharField(max_length=32,unique=True) ctime = models.DateTimeField(auto_now_add=True, null=True) uptime = models.DateTimeField(auto_now=True, null=True) # user_list = Userinfo.objects.all() # 讀取的時一個queryset的列表對象,封裝了id,username,email,user_group_id, 在user_group_id中又封裝#了uid和caption # [obj(id,username,email,user_group_id,,user_group_id(uid,caption)),obj,obj] # for row in user_list: # print(row.user_group_id) # print(row.user_group.uid) # print(row.user_group.caption) class UserInfo(models.Model): # id列,自增,主鍵 # 用戶名列,字符串類型,指定長度 # 字符串、數字、時間、二進制 username = models.CharField(max_length=32,blank=True,verbose_name='用戶名') password = models.CharField(max_length=60, help_text='pwd') email = models.CharField(max_length=60) test = models.EmailField(max_length=19,null=True,error_messages={'invalid': '請輸入密碼'}) # user_group_id 數字 user_group = models.ForeignKey("UserGroup",to_field='uid') # (uid,catption,ctime,uptimew) user_type_choices = ( (1, '超級用戶'), (2, '普通用戶'), (3, '普普通用戶'),