day67 ORM 特殊的語法 一個簡單的語法 --翻譯成--> SQL語句 語法: 1. 操做數據庫表 建立表、刪除表、修改表 2. 操做數據庫行 增、刪、改、查 怎麼連數據庫: 須要手動建立數據庫 手寫一段代碼 告訴Django連哪一個數據庫 告訴Django用pymysql代替默認的MySQLdb 發命令: python manage.py makemigrations python manage.py migrate 總結詳細步驟: 1. 手動建立數據庫 2. 在app/models.py裏面寫上一個類,必須繼承models.Model這個類 (注意啓動Django項目) 3. 在Django 項目的settings.py 裏面 配置上數據庫的相關信息 4. 在Django項目裏的__init__.py裏面寫上 兩句話 import pymysql pymysql.install_as_MySQLdb() 5. 給Django發佈命令 1. python manage.py makemigrations # 至關於去你的models.py 裏面看一下有沒有改動 2. python manage.py migrate # 把改動翻譯成SQL語句,而後去數據庫執行 models.py --> Django翻譯成SQL --> pymysql --> MySQL(4p) 哪吒老師ORM思想: 五步四部分 目前爲止學到的特殊語法之操做數據表部分: 1. 經過建一個類(繼承models.Model) --> 至關於建立了一個數據庫中的表 --> 類 - 數據表 2. 字段: 1. models.AutoField(primary_key=True) --> int 自增的 主鍵 2. models.CharField(max_length=32, null=True) --> varchar(32) 3. models.IntegerField() # int 總結一下: models.py MySQL 類 對應 數據表 類的屬性 對應 數據庫裏面的字段(列) 對象 對應 一行數據(一條數據) ORM究竟是什麼? 對象關係映射 數據行的操做: 增:兩種 1. models.User.objects.create(**{}) 直接建立而且提交到數據庫 2. user = models.User(**{}) user.save() 刪: 找到對象刪除 models.User.objects.filter().delete() 改: 更新 兩種 1. models.User.objects.filter().update(username="一枝花") 2. user = models.User.objects.get(id=1) user.username="梁志華" user.save() 查: models.User.objects.all() models.User.objects.get(條件) 不知足條件就報錯|返回的是一個對象 models.User.objects.filter(條件) 不知足條件不報錯,可是返回的結果是一個對象的列表 models.User.objects.filter().first() models.User.objects.filter().last() models.User.objects.exclude(條件)
Django之ORM的含義html
O-->objectpython
R--->relational(連接)mysql
M--->mapping(映射)git
orm介紹程序員
orm概念sql
對象映射關係模式是一種爲了解決面相對象與關係數據庫存在的互不匹配的現象的技術數據庫
,簡單來講orm是經過使用描述對象和數據庫之間映射的元數據,將程序中的對象自動化持久關旭數據庫中.orm在業務邏輯層和數據層之間充當了橋樑的做用django
咱們的數據庫操做相對比較複雜,咱們在django框架的基礎上,使用的這個orm就能夠在不使用數據庫的基礎上,對數據庫裏面的信息進行操做,執行起來更加的簡單,便捷,api
orm由來數組
咱們的全部軟件開發過程當中都是會涉及到對象和關係數據庫在用戶層面和業務邏輯層面咱們是面相對象的,當對象的信息發生變化的時候咱們須要把對象的信息保存到關係數據庫中
按照以前的方法來進行開發就會出現程序員本身的業務邏輯代碼中夾雜着不少的sql語句來增長,讀取,修改和刪除相關數據,而這些代碼一般都是重複的,
orm的優點
它主要問題是解決關係的映射,它一般把一個類和一個表一一對應
類的每一個實例對應表中的一條數據,類的每一個屬性對應表中的每一個字段
orm提供了對數據庫的映射,不用直接編寫sql語句,只須要像操做對象同樣從數據庫裏操做數據,讓發開發人員專一於開發本身的業務邏輯處理,提升了開發效率
orm的劣勢
orm的缺點是會在必定程度上犧牲程序員的執行效率,並且用得多了之後咱們就會忘記sql語句如何寫了,關係數據庫的相關技能會退化...全部的自動化機制都是這樣的,把人力從繁雜的勞動中解放出來而後相關的技能呢就會退化,就會更加的依賴於機器,或者更加便捷的程序,就像咱們的機器人總動員同樣,劇中最後船長甚至沒有自由行走的能力都是由於過分依賴於過度便捷的機器致使的.
orm總結,
orm只是一種工具,工具確實可以解決一些重複簡單的勞動,這是不能否認的.
但咱們不能期望某個工具一勞永逸地解決全部問題,一些特殊問題仍是須要特殊處理的,
可是在整個軟件開發過程當中須要特殊處理的狀況應該都是不多的,不然所謂的工具也就失去了它存在的意義.
model
model是django中數據的單一明確的信息來源,它包含了你所存儲的數據的重要字段,和行爲,一般一個模型model映射到一個數據表格
基本狀況:
每一個模型都是一個python類,它是django.db.model的子類
模型的每一個屬性都表明了一個數據庫字段
綜上所述,django爲您提供了一個自動生成的數據庫訪問api,
表格的名字是自動生成的,若是你要自定義表名,須要在model的Meta類中定義db_table參數,通常會寫成小寫的表名,格式就是在咱們定義好的類和類屬性下面,以下所示:
class Pupil(models.Model):
id = models.AutoField(primary_key=True) #自增id
sname = models.CharField(max_length=30, null=True) #至關vachar
age = models.IntegerField(null=True) #int 默認爲空
# cid = models.IntegerField()
class Meta:
db_table = 'pupil'
經過django 類名是前面有前綴 可是這麼些名字會改變沒有後綴
1 AutoField(Field) 2 - int自增列,必須填入參數 primary_key=True 3 4 BigAutoField(AutoField) 5 - bigint自增列,必須填入參數 primary_key=True 6 7 注:當model中若是沒有自增列,則自動會建立一個列名爲id的列 8 from django.db import models 9 10 class UserInfo(models.Model): 11 # 自動建立一個列名爲id的且爲自增的整數列 12 username = models.CharField(max_length=32) 13 14 class Group(models.Model): 15 # 自定義自增列 16 nid = models.AutoField(primary_key=True) 17 name = models.CharField(max_length=32) 18 19 SmallIntegerField(IntegerField): 20 - 小整數 -32768 ~ 32767 21 22 PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField) 23 - 正小整數 0 ~ 32767 24 IntegerField(Field) 25 - 整數列(有符號的) -2147483648 ~ 2147483647 26 27 PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField) 28 - 正整數 0 ~ 2147483647 29 30 BigIntegerField(IntegerField): 31 - 長整型(有符號的) -9223372036854775808 ~ 9223372036854775807 32 33 BooleanField(Field) 34 - 布爾值類型 35 36 NullBooleanField(Field): 37 - 能夠爲空的布爾值 38 39 CharField(Field) 40 - 字符類型 41 - 必須提供max_length參數, max_length表示字符長度 42 43 TextField(Field) 44 - 文本類型 45 46 EmailField(CharField): 47 - 字符串類型,Django Admin以及ModelForm中提供驗證機制 48 49 IPAddressField(Field) 50 - 字符串類型,Django Admin以及ModelForm中提供驗證 IPV4 機制 51 52 GenericIPAddressField(Field) 53 - 字符串類型,Django Admin以及ModelForm中提供驗證 Ipv4和Ipv6 54 - 參數: 55 protocol,用於指定Ipv4或Ipv6, 'both',"ipv4","ipv6" 56 unpack_ipv4, 若是指定爲True,則輸入::ffff:192.0.2.1時候,可解析爲192.0.2.1,開啓此功能,須要protocol="both" 57 58 URLField(CharField) 59 - 字符串類型,Django Admin以及ModelForm中提供驗證 URL 60 61 SlugField(CharField) 62 - 字符串類型,Django Admin以及ModelForm中提供驗證支持 字母、數字、下劃線、鏈接符(減號) 63 64 CommaSeparatedIntegerField(CharField) 65 - 字符串類型,格式必須爲逗號分割的數字 66 67 UUIDField(Field) 68 - 字符串類型,Django Admin以及ModelForm中提供對UUID格式的驗證 69 70 FilePathField(Field) 71 - 字符串,Django Admin以及ModelForm中提供讀取文件夾下文件的功能 72 - 參數: 73 path, 文件夾路徑 74 match=None, 正則匹配 75 recursive=False, 遞歸下面的文件夾 76 allow_files=True, 容許文件 77 allow_folders=False, 容許文件夾 78 79 FileField(Field) 80 - 字符串,路徑保存在數據庫,文件上傳到指定目錄 81 - 參數: 82 upload_to = "" 上傳文件的保存路徑 83 storage = None 存儲組件,默認django.core.files.storage.FileSystemStorage 84 85 ImageField(FileField) 86 - 字符串,路徑保存在數據庫,文件上傳到指定目錄 87 - 參數: 88 upload_to = "" 上傳文件的保存路徑 89 storage = None 存儲組件,默認django.core.files.storage.FileSystemStorage 90 width_field=None, 上傳圖片的高度保存的數據庫字段名(字符串) 91 height_field=None 上傳圖片的寬度保存的數據庫字段名(字符串) 92 93 DateTimeField(DateField) 94 - 日期+時間格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] 95 96 DateField(DateTimeCheckMixin, Field) 97 - 日期格式 YYYY-MM-DD 98 99 TimeField(DateTimeCheckMixin, Field) 100 - 時間格式 HH:MM[:ss[.uuuuuu]] 101 102 DurationField(Field) 103 - 長整數,時間間隔,數據庫中按照bigint存儲,ORM中獲取的值爲datetime.timedelta類型 104 105 FloatField(Field) 106 - 浮點型 107 108 DecimalField(Field) 109 - 10進制小數 110 - 參數: 111 max_digits,小數總長度 112 decimal_places,小數位長度 113 114 BinaryField(Field) 115 - 二進制類型
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)', 自定義一個無符號整數字段
1 class FixedCharField(models.Field): 2 """ 3 自定義的char類型的字段類 4 """ 5 def __init__(self, max_length, *args, **kwargs): 6 self.max_length = max_length 7 super(FixedCharField, self).__init__(max_length=max_length, *args, **kwargs) 8 9 def db_type(self, connection): 10 """ 11 限定生成數據庫表的字段類型爲char,長度爲max_length指定的值 12 """ 13 return 'char(%s)' % self.max_length 14 15 16 class Class(models.Model): 17 id = models.AutoField(primary_key=True) 18 title = models.CharField(max_length=25) 19 # 使用自定義的char類型的字段 20 cname = FixedCharField(max_length=25) 21 複製代碼
1 1.觸發Model中的驗證和錯誤提示有兩種方式: 2 a. Django Admin中的錯誤信息會優先根據Admiin內部的ModelForm錯誤信息提示,若是都成功,纔來檢查Model的字段並顯示指定錯誤信息 3 b. 使用ModelForm 4 c. 調用Model對象的 clean_fields 方法,如: 5 # models.py 6 class UserInfo(models.Model): 7 nid = models.AutoField(primary_key=True) 8 username = models.CharField(max_length=32) 9 10 email = models.EmailField(error_messages={'invalid': '格式錯了.'}) 11 12 # views.py 13 def index(request): 14 obj = models.UserInfo(username='11234', email='uu') 15 try: 16 print(obj.clean_fields()) 17 except Exception as e: 18 print(e) 19 return HttpResponse('ok') 20 21 # Model的clean方法是一個鉤子,可用於定製操做,如:上述的異常處理。 22 23 2.Admin中修改錯誤提示 24 # admin.py 25 from django.contrib import admin 26 from model_club import models 27 from django import forms 28 29 30 class UserInfoForm(forms.ModelForm): 31 age = forms.IntegerField(initial=1, error_messages={'required': '請輸入數值.', 'invalid': '年齡必須爲數值.'}) 32 33 class Meta: 34 model = models.UserInfo 35 # fields = ('username',) 36 fields = "__all__" 37 exclude = ['title'] 38 labels = { 'name':'Writer', } 39 help_texts = {'name':'some useful help text.',} 40 error_messages={ 'name':{'max_length':"this writer name is too long"} } 41 widgets={'name':Textarea(attrs={'cols':80,'rows':20})} 42 43 class UserInfoAdmin(admin.ModelAdmin): 44 form = UserInfoForm 45 46 admin.site.register(models.UserInfo, UserInfoAdmin)
1 null 數據庫中字段是否能夠爲空 2 db_column 數據庫中字段的列名 3 default 數據庫中字段的默認值 4 primary_key 數據庫中字段是否爲主鍵 5 db_index 數據庫中字段是否能夠創建索引 6 unique 數據庫中字段是否能夠創建惟一索引 7 unique_for_date 數據庫中字段【日期】部分是否能夠創建惟一索引 8 unique_for_month 數據庫中字段【月】部分是否能夠創建惟一索引 9 unique_for_year 數據庫中字段【年】部分是否能夠創建惟一索引 10 11 verbose_name Admin中顯示的字段名稱 12 blank Admin中是否容許用戶輸入爲空 13 editable Admin中是否能夠編輯 14 help_text Admin中該字段的提示信息 15 choices Admin中顯示選擇框的內容,用不變更的數據放在內存中從而避免跨表操做 16 如:gf = models.IntegerField(choices=[(0, '何穗'),(1, '大表姐'),],default=1) 17 18 error_messages 自定義錯誤信息(字典類型),從而定製想要顯示的錯誤信息; 19 字典健:null, blank, invalid, invalid_choice, unique, and unique_for_date 20 如:{'null': "不能爲空.", 'invalid': '格式錯誤'} 21 22 validators 自定義錯誤驗證(列表類型),從而定製想要的驗證規則 23 from django.core.validators import RegexValidator 24 from django.core.validators import EmailValidator,URLValidator,DecimalValidator,\ 25 MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator 26 如: 27 test = models.CharField( 28 max_length=32, 29 error_messages={ 30 'c1': '優先錯信息1', 31 'c2': '優先錯信息2', 32 'c3': '優先錯信息3', 33 }, 34 validators=[ 35 RegexValidator(regex='root_\d+', message='錯誤了', code='c1'), 36 RegexValidator(regex='root_112233\d+', message='又錯誤了', code='c2'), 37 EmailValidator(message='又錯誤了', code='c3'), ]
# 增 models.Tb1.objects.create(c1='xx', c2='oo') # 增長一條數據,能夠接受字典類型數據 **kwargs obj = models.Tb1(c1='xx', c2='oo') obj.save() # 查 models.Tb1.objects.get(id=123) # 獲取單條數據,不存在則報錯(不建議) models.Tb1.objects.all() # 獲取所有 models.Tb1.objects.filter(name='seven') # 獲取指定條件的數據 models.Tb1.objects.exclude(name='seven') # 去除指定條件的數據 # 刪 # models.Tb1.objects.filter(name='seven').delete() # 刪除指定條件的數據 # 改 models.Tb1.objects.filter(name='seven').update(gender='0') # 將指定條件的數據更新,均支持 **kwargs obj = models.Tb1.objects.get(id=1) obj.c1 = '111' obj.save() # 修改單條數據
# 獲取個數 # # models.Tb1.objects.filter(name='seven').count() # 大於,小於 # # models.Tb1.objects.filter(id__gt=1) # 獲取id大於1的值 # models.Tb1.objects.filter(id__gte=1) # 獲取id大於等於1的值 # models.Tb1.objects.filter(id__lt=10) # 獲取id小於10的值 # models.Tb1.objects.filter(id__lte=10) # 獲取id小於10的值 # models.Tb1.objects.filter(id__lt=10, id__gt=1) # 獲取id大於1 且 小於10的值 # in # # models.Tb1.objects.filter(id__in=[11, 22, 33]) # 獲取id等於十一、2二、33的數據 # models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in # isnull # Entry.objects.filter(pub_date__isnull=True) # contains # # models.Tb1.objects.filter(name__contains="ven") # models.Tb1.objects.filter(name__icontains="ven") # icontains大小寫不敏感 # models.Tb1.objects.exclude(name__icontains="ven") # range # # models.Tb1.objects.filter(id__range=[1, 2]) # 範圍bettwen and # 其餘相似 # # startswith,istartswith, endswith, iendswith, # order by # # models.Tb1.objects.filter(name='seven').order_by('id') # asc # models.Tb1.objects.filter(name='seven').order_by('-id') # desc # group by # # from django.db.models import Count, Min, Max, Sum # models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num')) # SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id" # limit 、offset # # models.Tb1.objects.all()[10:20] # regex正則匹配,iregex 不區分大小寫 # # Entry.objects.get(title__regex=r'^(An?|The) +') # Entry.objects.get(title__iregex=r'^(an?|the) +') # date # # Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1)) # Entry.objects.filter(pub_date__date__gt=datetime.date(2005, 1, 1)) # year # # Entry.objects.filter(pub_date__year=2005) # Entry.objects.filter(pub_date__year__gte=2005) # month # # Entry.objects.filter(pub_date__month=12) # Entry.objects.filter(pub_date__month__gte=6) # day # # Entry.objects.filter(pub_date__day=3) # Entry.objects.filter(pub_date__day__gte=3) # week_day # # Entry.objects.filter(pub_date__week_day=2) # Entry.objects.filter(pub_date__week_day__gte=2) # hour # # Event.objects.filter(timestamp__hour=23) # Event.objects.filter(time__hour=5) # Event.objects.filter(timestamp__hour__gte=12) # minute # # Event.objects.filter(timestamp__minute=29) # Event.objects.filter(time__minute=46) # Event.objects.filter(timestamp__minute__gte=29) # second # # Event.objects.filter(timestamp__second=31) # Event.objects.filter(time__second=2) # Event.objects.filter(timestamp__second__gte=31)
orm 的增刪改查 班級 學生老師表
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>學生表</title> </head> <body> <div><h>學生表</h></div> <table border="1" style="color: #2aabd2"> <thead> <tr> <th>序號</th> <th>學生ID</th> <th>學生名字</th> <th>學生信息</th> <th>所在班級</th> </tr> </thead> <tbody> {% for student in st_list %} <tr> <td>{{ forloop.counter }}</td> <td>{{ student.id }}</td> <td>{{ student.sname }}</td> <td>{{ student.detail_id}}</td> <td>{{ student.cid_id}}</td> <td> {# 經過get 方法取值的#} {# <a href="/app0001/edit_student_list/?student_id={{ student.id }}" style="color:blue ; text-decoration: none">編輯</a>#} {# 經過分組的方法取值的#} <a href="{% url 'app0001urls:editstudentlist' student.id %}" style="color:blue ; text-decoration: none">編輯</a> <a href="{% url 'app0001urls:deletestudentlist' student.id %}" style="color:blue ; text-decoration: none">刪除</a> </td> </tr> {% endfor %} <tr> <a href="/app0001/add_student_list/" style="color:red ; text-decoration: none">添加</a> </tr> </tbody> </table> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>老師表</title> </head> <body> <table border="1"> <thead> <tr> <th>序號</th> <th>老師ID</th> <th>老師姓名</th> <th>授課班級</th> </tr> </thead> <tbody> {#teacher_list 取到全部的老師#} {% for teacher in teacher_list %} <tr> <td>{{ forloop.counter }}</td> <td>{{ teacher.id }}</td> <td>{{ teacher.tname }}</td> {# 授課班級的展現 老師的#} <td> {# 注意注意 ?????這裏cid #} {# teacher.cid.all 在html不用加上括號是什麼 意思就是每一個 #} {% for class in teacher.cid.all %} {{ class.cname }} {% endfor %} </td> <td> <a href="{% url 'app0001urls:deleteteacherlist' teacher.id %}">刪除</a> <a href="{% url 'app0001urls:editteacherlist' teacher.id %}">編輯</a> </td> </tr> {% endfor %} {# 這裏注意網址 由於django 項目已經開啓子項目的命名#} <a href="{% url 'app0001urls:addteacherlist'%}">添加</a> {# <a href="{% url 'app0001urls:addteacherlist'%}">添加</a>#} {# <tr><a href="/app0001/add_class_list/">添加</a></tr>#} {# <tr><a href="{% url 'app0001urls:addclasslist' %}">添加</a></tr>#} </tbody> </table> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>老師表</title> </head> <body> <form action="{% url 'app0001urls:addteacherlist' %}" method="post" > {# 這個不須要去settings 註釋了#} {% csrf_token %} {# <input type="text" name="class_id" style="display: none">#} 老師姓名<input type="text" name="teacher_name"> {# multiple 說明是多選#} <label for="t_id"></label> {# name 對應的value 是提交的值此時的id是多個 由於是個多選 #} <select name="class_id" id="t_id" multiple>授課班級 {% for class in class_list %} <option value="{{ class.id }}">{{ class.cname }}</option> {% endfor %} </select> <input type="submit" value="提交"> <input type="submit" value="取消"> </form> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>班級表</title> </head> <body> {#這裏的form 表單裏由於url 那裏已經分組 必須是兩個參數組成的url action 必須是兩部分e_name1.id 就是那個\d+#} <form action="{% url 'app0001urls:editclasslist' e_name1.id %}" method="post" > {% csrf_token %} {# id這裏必需要有id的值爲何 由於POST 經過id的name 取值 他的值就是如今的value#} <input type="text" name="class_id" value="{{ e_name1.id }}" style="display: none"> 班級名稱<input type="text" name="class_name" value='{{ e_name1.cname }}'> {# 時間的類型注意#} 開班時間<input type="date" name="first_day" value='{{ e_name1.first_day|date:'Y-m-d'}}'> <input type="submit" value="提交"> <a href="/app0001/class_list/">取消</a> </form> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>編輯學生表</title> </head> <body> {#別名返鄉解析分組 經過分組 url 參數兩個 這裏也要了兩個 不傳也行 可是考慮網址變化#} {#e_name1.id 是編輯 經過分組拿到的arg 的值#} <form action="{% url 'app0001urls:editstudentlist' e_svalue1.id %}" method= "post"> {% csrf_token %} <div> <input type="text" name="s_id" value="{{ e_svalue1.id }}" style="display: none"> 學生姓名<input type="text" name="s_name" value="{{ e_svalue1.sname }}"> </div> <div>所在班級 <label for="class_id"></label> <select name="class_name" id="class_id"> {% for class in class_list %} {# 編輯的默認值 判斷操做 開始{% ifXX %} {% else %}結束{% endif %}#} {% if e_svalue1.id == class.id %} <option selected value="{{ class.id }}">{{ class.cname }}</option> {% else %} <option value="{{ class.id }}">{{ class.cname }}</option> {% endif %} {% endfor %} </select> </div> <div> <input type="submit" value="取消"> <input type="submit" value="提交"> </div> </form> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>編輯老師表</title> </head> <body> {#別名返鄉解析分組 經過分組 url 參數兩個 這裏也要了兩個 不傳也行 可是考慮網址變化#} {#e_name1.id 是編輯 經過分組拿到的arg 的值#} <form action="{% url 'app0001urls:editteacherlist' teacher_id.id %}" method="post"> {% csrf_token %} 老師姓名<input type="text" name="teacher_name" value="{{ teacher_id.tname }}"> <label for="t_id"></label> 授課班級<select name="class_id" id="t_id" multiple> {% for class in class_list %} {# 注意此處 若是這個班級在點擊編輯老師的cid表中取得的全部對象中 .all 在html 不要加括號#} {% if class in teacher_id.cid.all %} <option selected value="{{ class.id }}">{{ class.cname }}</option> {% else %} <option value="{{ class.id }}">{{ class.cname }}</option> {% endif %} {% endfor %} </select> <div> <input type="submit" value="取消"> <input type="submit" value="提交"> </div> </form> {# <form action="{% url 'app0001urls:editteacherlist' %}" method= "post">#} {##} {# <div>#} {# <input type="text" name="s_id" value="{{ e_svalue1.id }}" style="display: none">#} {# 學生姓名<input type="text" name="s_name" value="{{ e_svalue1.sname }}">#} {# </div>#} {# <div>所在班級#} {# <label for="class_id"></label>#} {# <select name="class_name" id="class_id">#} {# {% for class in class_list %}#} {# 編輯的默認值 判斷操做 開始{% ifXX %} {% else %}結束{% endif %}#} {# {% if e_svalue1.id == class.id %}#} {# <option selected value="{{ class.id }}">{{ class.cname }}</option>#} {# {% else %}#} {# <option value="{{ class.id }}">{{ class.cname }}</option>#} {# {% endif %}#} {# {% endfor %}#} {# </select>#} {##} {# </div>#} {##} {# <div>#} {# <input type="submit" value="取消">#} {# <input type="submit" value="提交">#} {# </div>#} {##} {#</form>#} </body> </html>
from django.shortcuts import render,redirect,HttpResponse from app0001 import models from django.urls import reverse # Create your views here. # 建表 添加數據庫到頁面 def class_list(request): class_list = models.Ban_list.objects.all() # add_class_list = models.Ban_list.objects.create(cname='Python 1期',) # add_class_list = models.Ban_list.objects.create(cname='Python 2期',) # add_class_list = models.Ban_list.objects.create(cname='Python 3期',) # add_class_list = models.Ban_list.objects.create(cname='Python 4期',) # add_class_list = models.Ban_list.objects.create(cname='Python 5期',) # add_class_list = models.Ban_list.objects.create(cname='Linux 1期',) # add_class_list = models.Ban_list.objects.create(cname='Linux 2期',) # add_class_list = models.Ban_list.objects.create(cname='Linux 3期',) # add_class_list = models.Ban_list.objects.create(cname='Linux 4期',) # 增長 # class1= models.Ban_list.objects.create(cname='Java 1期') # 刪除 # models.Ban_list.objects.filter(id=11).delete() # 改i # models.Ban_list.objects.filter(id=10).update(cname='大數據1期') # 查找 # models.Ban_list.objects.all # c1=models.Ban_list.objects.get(id=5) # c1 = models.Ban_list.objects.filter(id=5) # c1 = models.Ban_list.objects.exclude(cname='Python 2期') # print(c1[5].cname) return render(request, 'class_list.html', {'class_list':class_list}) # ORM 增長數據 def add_class_list(request): if request.method == 'POST': c_name = request.POST.get("class_name") first_day = request.POST.get("first_day1") models.Ban_list.objects.create(cname=c_name,first_day=first_day) return redirect(reverse('app0001urls:classlist')) #經過別名返回list # return redirect('/app0001/class_list/ ') #經過真實網址返回list return render(request, "add_class_list.html") # # # ORM 刪除數據 def delete_class_list(request): d_id = request.GET.get('class_id') models.Ban_list.objects.filter(id=d_id).delete() # 若是沒有頁面只能去跳轉 # return redirect('/app0001/class_list/') return redirect(reverse('app0001urls:classlist')) # # 更改數據 def edit_class_list(request,arg): # 這裏是經過分組取值的方法獲得arg,點擊編輯的時候生成url 和id的值 id的值就是arg if request.method == 'POST': e_id = request.POST.get("class_id") e_name1 = request.POST.get('class_name') first1_day = request.POST.get('first_day') models.Ban_list.objects.filter(id=e_id).update(cname=e_name1,first_day=first1_day) return redirect(reverse('app0001urls:classlist')) # 經過編輯的連接取值arg e_name = models.Ban_list.objects.get(id=arg) return render(request,'edit_class_list.html',{'e_name1':e_name}) # e_id = request.GET.get('class_id') #這裏是經過編輯的id 經過的是get 取值 # if request.method == 'POST': # # e_id = request.POST.get('class_id') 這裏不能取值 # # 只有在form 表單裏面才能進行post 取值 別的地方就不能取值 # e_name = request.POST.get("class_name") # models.Ban_list.objects.filter(id=e_id).update(cname=e_name) # # return redirect('/app0001/class_list/') # return redirect(reverse('app0001urls:classlist')) # # # e_name= models.Ban_list.objects.get(id=e_id) #get 取一條是一個對象 # e_name1 = models.Ban_list.objects.filter(id=e_id) #filter 取一條是一個表 必須加索引 # e_name1 = e_name1[0] #此變量對應後邊編輯的默認的值 # return render(request, 'edit_class_list.html', {'e_name1':e_name1}) # # # 建表 添加數據庫的頁面 def student_list(request): st_list = models.Student_list.objects.all() return render(request, 'student_list.html', {'st_list': st_list}) def add_student_list(request): if request.method == 'POST': sname1 = request.POST.get('s_name') cid1 = request.POST.get('class_id') # 方法一 經過 cid的值操做 注意這cid_id 這個是Student_list 經過外鍵造成的,cid 是個對象 cid_id 是個數字 # models.Student_list.objects.create(sname=sname1,cid_id=cid1) # 方法二 經過orm 對象 對應的 學生表的cid對象 而不是cid_idd的值數字 object_c = models.Ban_list.objects.get(id=cid1) models.Student_list.objects.create(sname=sname1, cid=object_c) return redirect(reverse('app0001urls:studentlist')) class_list = models.Ban_list.objects.all() return render(request, 'add_student_list.html',{'class_list':class_list}) def delete_student_list(request,sid): # 經過url分組取值的方法 models.Student_list.objects.filter(id=sid).delete() # 經過get取值的方法 # d_id = request.GET.get('student_id') # models.Student_list.objects.filter(id=d_id).delete() return redirect(reverse('app0001urls:studentlist')) # def edit_student_list(request): # e_id = request.GET.get('student_id') # if request.method == 'POST': # e_sname = request.POST.get('s_name') # e_cid = request.POST.get('c_id') # models.Student_list.objects.filter(id=e_id).update(sname=e_sname,cid=e_cid) # return redirect(reverse('app0001urls:studentlist')) # e_id = request.GET.get('student_id') # e_svalue2 = models.Student_list.objects.filter(id=e_id) # e_svalue= e_svalue2[0] # return render(request, 'edit_student_list.html', {'e_svalue1':e_svalue}) # def edit_student_list(request,arg): # # e1_svalue = models.Student_list.objects.filter(id=arg) # if request.method == 'POST': # # 只有在form 表單裏面才能進行post 取值 別的地方就不能取值 # e_name = request.POST.get("class_name") # models.Ban_list.objects.filter(id=e_id).update(cname=e_name) # # return redirect('/app0001/class_list/') # return redirect(reverse('app0001urls:classlist')) # # e1_svalue= models.Student_list.objects.filter(id=arg) # e1_svalue= e1_svalue[0] # return render(request,'edit_student_list.html',{'e_svalue1':e1_svalue}) def edit_student_list(request,sid): if request.method == 'POST': sname1 = request.POST.get('s_name') class1 = request.POST.get('class_name') # 方法一 經過分組get 獲得一個對象不支持鏈式操做 # student_obj = models.Student_list.objects.get(id=sid) # student_obj.sname = sname1 # 注意student_obj 是個對象 學生錶鏈表後 cid 是對象 cid_id 是班級的id # student_obj.cid_id = class1 # student_obj.save() # 方法二直接filter 取值 後邊直接鏈式操做 models.Student_list.objects.filter(id=sid).update(sname=sname1, cid_id=class1) return redirect(reverse('app0001urls:studentlist')) # 先經過分組拿到帶有值得form 表單取得對象能鏈式操做 e_svalue1 = models.Student_list.objects.get(id=sid) # 取得班級的列表 class_list = models.Ban_list.objects.all() return render(request,'edit_student_list.html', {'class_list': class_list,'e_svalue1': e_svalue1}) def teacher_list(request): teacher_list = models.Teacher.objects.all() # cid表明進入一張表 並無拿取對象 return render(request,'teacher_list.html',{'class_list':class_list,'teacher_list':teacher_list}) def add_teacher_list(request): if request.method == 'POST': teacher_name =request.POST.get('teacher_name') # 經過取得select name 班級的多個id值 的name?????? class_ids =request.POST.getlist('class_id') # 第一種數據庫直接添加 去數據庫插入一條信息 老師這個對象 數據庫 print(class_ids) # teacher_obj = models.Teacher.objects.create(tname=teacher_name) # # 這個老師對象的授課班級表添加id 由於是列表須要打算添加 # teacher_obj.cid.add(*class_ids) # print(teacher_obj.cid) # 第二中表裏添加對象 是之經過條件id增長 注意單個id是能夠直接等於 多個的話下劃線id__in teacher_obj = models.Teacher.objects.create(tname=teacher_name) class_objs = models.Ban_list.objects.filter(id__in=class_ids) teacher_obj.cid.add(*class_objs) return redirect(reverse('app0001urls:teacherlist')) class_list = models.Ban_list.objects.all() return render(request,'add_teacher_list.html',{'class_list':class_list}) def delete_teacher_list(request,tid): models.Teacher.objects.filter(id=tid).delete() return redirect(reverse('app0001urls:teacherlist')) def edit_teacher_list(request,tid): teacher_obj = models.Teacher.objects.get(id=tid) if request.method == 'POST': t_name=request.POST.get('teacher_name') class_ids=request.POST.getlist('class_id') # 注意這個要保存 teacher_obj.tname=t_name teacher_obj.save() teacher_obj.cid.set(class_ids) return redirect(reverse('app0001urls:teacherlist')) class_list = models.Ban_list.objects.all() teacher_id = models.Teacher.objects.get(id=tid) return render(request,'edit_teacher_list.html',{'class_list':class_list,'teacher_id':teacher_id})