Django用法補充

1. 自定義Admin

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 放到第二個參數;用於添加該自定義的操做

 

2.  經過models類獲取其app名稱和其數據表名: 

# 經過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

 

3. 獲取表的字段名:

# 獲取表的字段名:
model_obj._meta.get_field("xxx")

# 若是是choices字段,在數據前端展現的時候該列只會顯示數字,爲了能顯示對應的含義,須要針對每一個列名(字段名)進行判斷,若是 列.choices 不爲空,就說明該字段就是這類字段信息(若是 .choices不爲空,說明該字段是 choices 字段)

4. select_related()用法

#ORM語法中 .select_related() 就至關於 .all()
# 多對多關係時,必需要 .all()才能遍歷,如: {% for role in request.user.role.all %}<li><a href="">{{ role.name }}</a></li>{% endfor %}

 

5. django conf用法

from django import conf
conf.settings  # 動態獲取項目settings配置,如: conf.settings.INSTALLED_APPS
    

6. 動態導入模塊:

# 動態導入模塊:
# 把每一個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

 

7. 命令行直接調用Django的數據庫的對象:

python manage.py shell
# 命令行中直接進入項目的python環境時,是不能直接調用 數據庫對象的

8. 反射之模板語法

# 模板中不能使用 對象的反射,如: getattr(obj,"字段");此時能夠利用 自定義標籤,模板中不能用的語法就能夠在自定義標籤中實現

 

9. model表的choices字段

# 對於 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, '已退學'))
    """

10. mark_safe()用法:

from django.utils.safestring import mark_safe()
# mark_safe(element) 能使 element 保持 html屬性

 

11. choices 字段的 get_choices()方法:

# 外鍵字段對象 和 含有choices的字段對象 都有一個方法:.get_choices(),能獲取到該字段對應的全部選項(列表套元組的形式),而且會多出一個未選項的元組;調用者:字段對象
# 如:>>> a = models.CustomerInfo._meta.get_field("status")
    >>> a.get_choices()  # 字段對象.get_choices()
    # [('', '---------'), (0, '未報名'), (1, '已報名'), (2, '已退學')]
# 全部的字段對象都能有 .choices 這個屬性(但只有 有choices 的字段 纔會返回一個非空列表),但只有 有對外關聯的字段對象(如:外鍵字段或者有 choices 的字段) 纔有 .get_choices()的方法

12. 獲取字段類型

字段對象.get_internal_type()   
# 返回結果爲:CharField、DateField,ForeignKey 等

 

13. 分頁器

# (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  # 即當前的某一頁的頁碼數

14.  Q 函數的用法

# 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 

 

15. cls.base_fields 

cls.base_fields   # 字典,key包含全部的字段名,value包含全部的字段對象:{"字段名":字段對象,...}

16. forms組件

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)

 

17. output事件

# 前端:oninput事件:即時監聽輸入框中內容的變化

18. 獲取外鍵字段對象關聯的model表

# 獲取外鍵字段對象關聯的model表: 
# 字段對象.related_model ;django 1中也可用 字段對象.rel.to 

 

19. 獲取該記錄對象全部的反向關聯(外鍵)model表

記錄對象._meta.related_objects  #  獲取該記錄對象全部的反向關聯(外鍵)model表

20. forms組件添加字段級別的錯誤

forms組件添加字段級別的錯誤:add_error(字段名,"錯誤信息"),如:
def clean(self):
    ...
    self.add_error(field,"錯誤信息")  #  爲這個字段添加錯誤信息

 

21. csrf_exempt 裝飾器

讓某個視圖不走 csrf_token 驗證:使用 csrf_exempt 裝飾器
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def ...():
    視圖函數體
    

22. ORM 的 get_or_create()方法

model類.objects.get_or_create(...)  # 數據庫中若是該對象不存在則建立,若是已存在則返回該對象;# 返回值是一個元組:(記錄對象,bool值)

 

23. Django的 get_user_model()方法

# 若是想跨表調用 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>

"""
相關文章
相關標籤/搜索