from django.contrib import admin from xx import models # 自定義操做 class CustomerAdmin(admin.ModelAdmin): # 繼承 admin.ModelAdmin list_display = ["name","contact_type","contact","source","consult_content","status","consultant","date"] # 展現哪一個字段 list_filter = ["source","consultant","status","date"] # 過濾功能 search_fields = ["contact","name","consultant__name"] # consultant是外鍵,對應一對一的一張表,此時須要指明是外鍵關聯表中的哪一個字段:經過 __ 的方式 readonly_fields = ['status','contact'] # 只讀字段 filter_horizontal = [] # 註冊操做 admin.site.register(models.CustomerInfo,CustomerAdmin) # 在註冊 CustomerInfo 表時,把 自定義的操做 CustomerAdmin 放到第二個參數;用於添加該自定義的操做
# 經過models類獲取其app名稱: model_class._meta.app_label
#經過models類獲取其數據表名(小寫): model_class._meta.model_name
# _meta是對數據表類的操做;經過 dir(model_class._meta) 的方式可查看 其全部的屬性;獲取 verbose_name:model_class._meta.verbose_name
# 獲取表的字段名: model_obj._meta.get_field("xxx") # 若是是choices字段,在數據前端展現的時候該列只會顯示數字,爲了能顯示對應的含義,須要針對每一個列名(字段名)進行判斷,若是 列.choices 不爲空,就說明該字段就是這類字段信息(若是 .choices不爲空,說明該字段是 choices 字段)
#ORM語法中 .select_related() 就至關於 .all() # 多對多關係時,必需要 .all()才能遍歷,如: {% for role in request.user.role.all %}<li><a href="">{{ role.name }}</a></li>{% endfor %}
from django import conf conf.settings # 動態獲取項目settings配置,如: conf.settings.INSTALLED_APPS
# 動態導入模塊: # 把每一個APP中的 kingadmin 動態導入 for app_name in conf.settings.INSTALLED_APPS: try: # mod = __import__("%s.kingadmin" % app_name) # 把每一個 app 中的 kingadmin.py 文件動態的導入進來;__import__(模塊名) mod = importlib.import_module(".kingadmin",app_name) print(mod) # print(mod.kingadmin) # __import__("%s.kingadmin" % app_name) 的模式下才有 mod.kingadmin,緣由以下 """ importlib.import_module 和 __import__()的區別: import_module()返回指定的包或模塊(例如,pkg.mod),而__import__()返回頂級包或模塊(pkg) 參考連接:https://blog.csdn.net/defending/article/details/78095402?locationNum=1&fps=1 """ except ModuleNotFoundError: pass
python manage.py shell # 命令行中直接進入項目的python環境時,是不能直接調用 數據庫對象的
# 模板中不能使用 對象的反射,如: getattr(obj,"字段");此時能夠利用 自定義標籤,模板中不能用的語法就能夠在自定義標籤中實現
# 對於 model表中有 choices 的字段,想要獲取其對應的值,可利用: 對象記錄.get_有choices的字段名_display() 如:obj.get_status_display(); # 判斷某個字段中是否含有 choices 的方法: """ (1)先獲取該字段對象(字段也是一個對象):model表._meta.fields("字段名");如:a = models.CustomerInfo._meta.get_field("status") (取一個字段對象); models.CustomerInfo._meta.fields:獲取全部的字段對象 (2)判斷該字段對象如a 是否有 choices 屬性:若是沒有choices屬性, a.choices 返回一個空列表;若是有choices屬性, a.choices返回 choices指代的元素(不爲空) 如:>>> a = models.CustomerInfo._meta.get_field("status") >>> a.choices # ((0, '未報名'), (1, '已報名'), (2, '已退學')) """
from django.utils.safestring import mark_safe() # mark_safe(element) 能使 element 保持 html屬性
# 外鍵字段對象 和 含有choices的字段對象 都有一個方法:.get_choices(),能獲取到該字段對應的全部選項(列表套元組的形式),而且會多出一個未選項的元組;調用者:字段對象 # 如:>>> a = models.CustomerInfo._meta.get_field("status") >>> a.get_choices() # 字段對象.get_choices() # [('', '---------'), (0, '未報名'), (1, '已報名'), (2, '已退學')] # 全部的字段對象都能有 .choices 這個屬性(但只有 有choices 的字段 纔會返回一個非空列表),但只有 有對外關聯的字段對象(如:外鍵字段或者有 choices 的字段) 纔有 .get_choices()的方法
字段對象.get_internal_type() # 返回結果爲:CharField、DateField,ForeignKey 等
# (1) .paginator:某一頁的page.paginator 就至關於 分頁器對象 >>> p = Paginator(objects, 2) >>> page2 = p.page(2) # page2.paginator === p # (2) 某一頁的page.number :表示當前的頁碼數 >>> p = Paginator(objects, 2) >>> p.page(4).number # 4 # 即當前的某一頁的頁碼數
# Q 函數的用法 from django.db.models import Q q = Q() q.connector = "OR" # Q 之間的邏輯關係爲「或」 q.children.append(("name__contains","x")) # 以元組的形式 把一個條件 添加到 Q 中 q.children.append(("contact__contains","xxx")) models.CustomerInfo.objects.filter(q) # 直接過濾q
cls.base_fields # 字典,key包含全部的字段名,value包含全部的字段對象:{"字段名":字段對象,...}
forms組件: ChoiceField,ModelChoiceField,ModelMultipleChoiceField:這三個可用於渲染 <select> 標籤 gender = forms.ChoiceField(choices=((1,"男"),(2,"女"))) # 不與數據庫打交道時用 ChoiceField; 語法:forms.ChoiceField(choices=(一個一個的元組)) # 和數據庫打交道: 單選用ModelChoiceField:publish = forms.ModelChoiceField(queryset=Publish.objects.all()) # 語法:forms.ModelChoiceField(queryset=QuerySet) 多選用ModelMultipleChoiceField: author = forms.ModelMultipleChoiceField(queryset=Author.objects.all()) # 語法:forms.ModelMultipleChoiceField(queryset=QuerySet)
# 前端:oninput事件:即時監聽輸入框中內容的變化
# 獲取外鍵字段對象關聯的model表: # 字段對象.related_model ;django 1中也可用 字段對象.rel.to
記錄對象._meta.related_objects # 獲取該記錄對象全部的反向關聯(外鍵)model表
forms組件添加字段級別的錯誤:add_error(字段名,"錯誤信息"),如: def clean(self): ... self.add_error(field,"錯誤信息") # 爲這個字段添加錯誤信息
讓某個視圖不走 csrf_token 驗證:使用 csrf_exempt 裝飾器 from django.views.decorators.csrf import csrf_exempt @csrf_exempt def ...(): 視圖函數體
model類.objects.get_or_create(...) # 數據庫中若是該對象不存在則建立,若是已存在則返回該對象;# 返回值是一個元組:(記錄對象,bool值)
# 若是想跨表調用 users 這個app 下的 UserProfile表(用戶信息表,繼承了 AbstractUser 這個類),則能夠利用 django的 get_user_model() 方法 from django.contrib.auth import get_user_model User = get_user_model() # 此時 User 表就是 users這個app下的 UserProfile表(繼承了 AbstractUser) """ get_user_model() 部分源碼: def get_user_model(): """ Return the User model that is active in this project. """ try: return django_apps.get_model(settings.AUTH_USER_MODEL, require_ready=False) # 用到了在 settings 中設置的 AUTH_USER_MODEL = "blog.UserInfo" (# 當本身的表繼承了 AbstractUser 時,須要在 settings 中有這個設置) except ValueError: raise ImproperlyConfigured("AUTH_USER_MODEL must be of the form 'app_label.model_name'") except LookupError: raise ImproperlyConfigured( "AUTH_USER_MODEL refers to model '%s' that has not been installed" % settings.AUTH_USER_MODEL ) """
ps: 注意點html
""" 1. request.user: .user是固定寫法,無論 auth.login(request,user_obj) 是以什麼形式 註冊的 2. request.user 要想能直接打印出來,與 auth_user 相關的那張表對應的 model類裏面須要有 __str__ 3. 下拉菜單中能夠是 <a> 標籤,如: <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">更多操做 <span class="caret"></span></a> """