zoukankan      html  css  js  c++  java
  • 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>
    
    """
  • 相关阅读:
    九.Protobuf3特殊类型
    八.Protobuf3更新消息类型(添加新的字段)
    七.Protobuf3 嵌套类型
    六.Protobuf3引入其他.proto文件
    五.Protobuf3 枚举
    四.Protobuf3 缺省值
    VC 在调用main函数之前的操作
    Windows下的代码注入
    C 堆内存管理
    VC++ 崩溃处理以及打印调用堆栈
  • 原文地址:https://www.cnblogs.com/neozheng/p/9637483.html
Copyright © 2011-2022 走看看