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值)

ps: 注意点

"""
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>

"""

猜你喜欢

转载自www.cnblogs.com/neozheng/p/9637483.html
今日推荐