Python 學習第十九天 django知識

來源:互聯網
上載者:User

標籤:auth   ipad   integer   userinfo   字母   creat   eth   admin   統計   

一,django 知識總結

1,同一個name屬性的標籤,多個值擷取

<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 標籤多選

<p>            <select name="city" multiple>                               #select標籤添加multiple屬性                <option value="sh">上海</option>                <option value="bj">北京</option>                <option value="tj">天津</option>            </select> </p>

3,檔案上傳

#form 表單中設定 
<form action="/login/" method="POST" enctype="multipart/form-data">
view.py
obj = request.FILES.get(‘fafafa‘)
print(obj,type(obj),obj.name)import osfile_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擷取字典中的值

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函數的參數位置是一致的,

  (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是以字典的形式接收參數

  總結  

a.  url中單個Regexurl(r‘^detail-(\d+)-(\d+).html‘, views.detail),def func(request, nid, uid):passdef func(request, *args):args = (2,9)def func(request, *args, **kwargs):args = (2,9)   b.   url 中的Regex以key.value形式定義url(r‘^detail-(?P<nid>\d+)-(?P<uid>\d+).html‘, views.detail)
def func(request, nid, uid):passdef 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 reversedef 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_userinfoclass 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  makemigrationspython 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是否可以為空白 =Truedefault                                    # 預設值  =""primary_key                                #主鍵     =Truedb_column                                  #列名     ="user"db_index                                   #索引     =Trueunique                                   #唯一索引 =Trueunique_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, ‘普普通使用者‘),

 

Python 學習第十九天 django知識

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.