标签:多选 try children list 级别 == ase name exp
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值)
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> """
标签:多选 try children list 级别 == ase name exp
原文地址:https://www.cnblogs.com/neozheng/p/9637483.html