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: 注意点
"""
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> """
Django用法补充的更多相关文章
- Django组件补充(缓存,信号,序列化)
Django组件补充(缓存,信号,序列化) Django的缓存机制 1.1 缓存介绍 1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑 ...
- Python学习---django知识补充之CBV
Django知识补充之CBV Django: url --> def函数 FBV[function based view] 用函数和URL进行匹配 url --> ...
- Django 知识点补充
Django 知识点补充 1 Django如何在Model保存前做一定的固定操作,比如写一条日志 (1)利用Django的Model的Signal Dispatcher, 通过django.db.mo ...
- Django知识补充
目录 一.文件上传 二.Models补充 三.Django总结 一.文件上传 1.通过form表单或者通过From类上传 views.py from django.shortcuts import r ...
- django进阶补充
前言: 这篇博客对上篇博客django进阶作下补充. 一.效果图 前端界面较简单(丑),有两个功能: 从数据库中取出书名 eg: 新书A 在form表单输入书名,选择出版社,选择作者(多选),输入完毕 ...
- 【django基础补充之URL,视图,模版】
一.url路由配置 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这段代 ...
- Python之Django rest_Framework补充
一.什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为"表征状态转移" ...
- Python菜鸟之路:Django 路由补充1:FBV和CBV - 补充2:url默认参数
一.FBV和CBV 在Python菜鸟之路:Django 路由.模板.Model(ORM)一节中,已经介绍了几种路由的写法及对应关系,那种写法可以称之为FBV: function base view ...
- Python Django框架 补充
Django REST framework ORM框架整理 Django框架 app间互借models字段的操作 ORM数据库操作补充:models中的一对一操作.过滤.事务 Django model ...
随机推荐
- 在spring boot 中使用itext和itextrender生成pdf文件
转载请注明出处 https://www.cnblogs.com/majianming/p/9539376.html 项目中需要对订单生成pdf文件,在第一版本其实已经有了比较满意的pdf文档,但是还是 ...
- 45 个非常有用的 Oracle 日期查询语句
日期/时间 相关查询 获取当前月份的第一天 运行这个命令能快速返回当前月份的第一天.你可以用任何的日期值替换 “SYSDATE”来指定查询的日期. SELECT TRUNC (SYSDATE, 'MO ...
- mui 时间日期控件(浏览器上无法查看,在手机端可以点击)
<head> <meta charset="utf-8"> <meta name="viewport" content=" ...
- Node.js——重定向
- [转] NTFS Permission issue with TAKEOWN & ICACLS
(转自:NTFS Permission issue with TAKEOWN & ICACLS - SAUGATA 原文日期:2013.11.19) Most of us using TA ...
- python3.x 判断当前版本【简单版】
import sys,string Major_Version_Number = 0 #当前python的主版本 Minor_Version_Number = 0 #当前python的次版本 def ...
- leetcode_Counting Bits_dp
给定num,用O(num)的时间复杂度计算0--num中所有数的二进制表示中1的个数. vector<int> countBits(int num) { vector<,); ;i& ...
- Python2和Python3除法
Python2和Python3除法 Python2除法:/,//,% "/":整数相除,向下取整:浮点数相除,结果包含小数(类似1/2,想保留小数应该写成1.0/2或者1*1. ...
- 【java】查重类的实现
import java.util.Vector; public class ElementCheck { // 重复优先 static Vector<Integer> CheckSameE ...
- Tensorflow入门-上
前置准备 在阅读本文之前,请确定你已经了解神经网络的基本结构以及前向传播.后向传播的基本原理,如果尚未了解,可以查看下文. 深度学习之神经网络 什么是TensorFlow? TensorFlow是Go ...