zoukankan      html  css  js  c++  java
  • Django之stark组件的使用和总结

    Stark组件的使用

    组件的字段

    list_display=[]  需要显示的字段
    
    list_display_links=[] #需要链接编辑字段
    
    Stark_Model_Form=[] #设置Model_Form
    
    search_fields=[] #搜索字段(多对多一对多需要__)
    
    actions=[] #自定义actions方法
    
     list_filter=[]  #过滤字段 不包括普通字段
    字段

    组件具体用法

    from stark.server.stark import ModelStark,site
    from repository import models
    from django.urls import re_path
    from django.shortcuts import HttpResponse,render,redirect
    from django.utils.safestring import mark_safe
    class StarkCourseRecord(ModelStark):
        def pach_init(self,request,queryset):
            temp=[]
            for course_obj in queryset:
                student_list=models.Student.objects.filter(class_list__id=course_obj.class_obj.id)
                for student in student_list:
                    obj=models.StudyRecord(student=student,course_record=course_obj)
                    temp.append(obj)
            models.StudyRecord.objects.bulk_create(temp)
        pach_init.desc='批量生成学生记录'
        def record(self,obj=None,header=False):
            if header:
                return '考勤'
            else:
                return mark_safe('<a href="/stark/repository/studyrecord/?course_record=%s">记录</a>'%obj.id)
    
        def record_score(self,obj=None,header=False):
            if header:
                return '批改成绩'
            else:
                return mark_safe('<a href="/stark/repository/courserecord/record_score/%s">批改</a>'%obj.id)
    
        def extra_url(self):
            temp = []
            temp.append(re_path(r'record_score/(d+)/', self.correcte_score))
            return temp
    
        def correcte_score(self, request, course_record_id):
            if request.method=='GET':
                study_record_list=models.StudyRecord.objects.filter(course_record=course_record_id)
                score_choices=models.StudyRecord.score_choices
                return render(request,'correcte_score.html',{'study_record_list':study_record_list,
                                                             'score_choices':score_choices})
            elif request.method=='POST':
                temp={}
                for i,val in request.POST.items():
                    if i=='csrfmiddlewaretoken':
                        continue
                    key,id=i.rsplit('_',maxsplit=1)
                    if id in temp:
                        temp[id][key]=val
                    else:
                        temp[id]={key:val}
                for nid,value in temp.items():
                    models.StudyRecord.objects.filter(id=nid).update(**value)
    
                return redirect(request.path)
    
        list_display = ['class_obj','day_num','teacher',record,record_score]
        list_display_links = ['class_obj']
        list_filter = ['class_obj',]
        actions = [pach_init,]
    
    
    site.register(models.CourseRecord,StarkCourseRecord)
    View Code

    组件知识点总结:

    1.路由分发

    2.单例模式

    3.如何通过模型类--->获得模型字符串名称,该模型所在的  app名称

    model
     <class 'repository.models.Book'>: --->repository/book
    model_name=model._meta.model_name #打印出该模型的名称
    app_namemodel._meta.app_label  #打印出该模型的app的名称
    View Code

    4.自运行项目app

    写成一个组件的模式
        1.为了确保移植性,仿照admin写成一个组件,
        自动生成url,通过配置能够进行增删改查过滤等其他功能
        2.每一个用到组件的app都需要一个stark.py
        3.再组件app希望像admin一样,在运行的时候先运行app下的admin
        那么我们仿照admin.在组件stark   app里进行配置
        from django.apps import AppConfig
        from django.utils.module_loading import autodiscover_modules
        class StarkConfig(AppConfig):
        name = 'stark'
    
        def ready(self):
            autodiscover_modules('stark',)
        配置完成以后,每次执行项目的时候会先运行app下的stark.py文件
    View Code

    5.属性可以反射,方法也可以反射,

    且类名和对象都可以通过(.)添加属性

    class A():
        b='1'
    a=A()
    A.abc='abc'
    a.abc='afg'
    print(A.abc) ------>abc
    print(a.abc)------>afg

    6.判断是否是函数的字段(字段,不是字符串, 字符串要用反射)

    if callable():

    7.安全标签

    from django.utils.safestring import mark_safe
    mark_safe(安全调用标签)

    8.reverse(别名+arg/kwargs)

    ****用reverse反向路由,后面要加args=(元组,)
    或者kwargs 放字典,但是key要相对应

    9.__str__

    class Person(object):
        def __init__(self,name):
            self.name=name
            
        def __str__(self):
            return self.name
            
    alex=Person('chen')
    
    返回的是对象
    print(alex.__str__()) --->chen
    print(str(alex)) --->chen
    View Code

    10.通过字符串和model 获取字段

    class Book(models.Model):
        name = models.CharField(max_length=64)
        price= models.IntegerField()
        
        name=Book._meta.get_field('name')
        #name拿到的是title字段的对象
        print(name)
        print(type(name))
        #可以取里面的属性
        name.max_length  --->64
    View Code

    11.request.GET数据备份

    ***注意***
    用到request.GET,需要修改里面的数据的时候
    用到不可以修改的变量的时候可以deepcopy一份

    12.urlencode()

    import copy
    copy.deepcopy 一份再去使用,防止修改原来的request.GET
    request.GET  ----> <QueryDict: {'p': ['2'], 'title': ['admin']}>
    
    ret=request.GET.urlencode() 将键值对转换为params拼接在url后面的键值对
    ret: p=2&title=admin
    View Code

    13.Q查询的玩法:

    Q的两种玩法:
    
    第一种:
    查询字段必须是字段
        Book.objects.filter(Q(title='yuan')|Q(price=123))
        
    第二种
    查询字段可以是字符串:
    
    #实例化一个Q对象
    search_connction=Q()
    #或查询默认是and
    search_connction.connector='or'
    
    for search_fiile in self.search_fiile   #self.search_fiile 用户自定制的['name','price']
        #append里面是一个元组
        #search_connction.children.append((search_fiile,'查询的内容'))
        search_connction.children.append((search_fiile+'__contains','查询的内容'))模糊查询
        
     def get_search_connection(self,request):
            self.key_word=request.GET.get('q','')
            search_connction=Q()
            if self.key_word:
                search_connction.connector='or'
                for fields in self.search_fields:
                    search_connction.children.append((fields+'__icontains',self.key_word))
            return search_connction
    View Code

    14.获取函数名字:

        def foo():
            print('ok')
            
        取函数名的:
    print(foo.__name__)

    15.拿到了字段字符串 和model类

    怎么取相关联的表??

    针对一对多或者多对多

    filter_fields=['author','publish']
    for field in filter_fields:
        filter_fields_obj=model._meta.get_field(field)
        
        #拿到关联表的内容:to=
        obj_list=filter_fields_obj.related_model.objects.all()
        #拿到的内容跟model.Publish.objects.all()一样 是一个Queryset
    View Code

    16.pop之自动关闭和调用父类的方法:

    #########父类##########
    function pop_window(url) {
            window.open(url,'','width=600,height=400,top=200,left=200')
        }
        function pop_handle(id,text,current_select) {
            var $option =$('<option>');
            $option.html(text);
            $option.val(id);
            $option.attr('selected','selected');
            $('#'+current_select).append($option)
        }
    
    
    ###########子类#########
    window.opener.pop_handle('{{ ret.id }}','{{ ret.text }}','{{ ret.current_select }}');
        window.close();
    View Code

    17.isinstance(类对象,类名)

    继承也为True

    18.limit_choices_to

    只有在运用ModelForm才有用:

    consultant = models.ForeignKey(verbose_name="课程顾问", to='UserInfo', related_name='consultanter',
                                       limit_choices_to={'depart_id': 1001},on_delete=models.CASCADE)
    
    
    class UserInfo(models.Model):
        depart = models.ForeignKey(verbose_name='部门', to="Department", to_field="code",on_delete=models.CASCADE)
    
    class Department(models.Model):
        """
        部门表
        市场部     1000
        销售       1001
        """
        title = models.CharField(verbose_name='部门名称', max_length=16)
        code = models.IntegerField(verbose_name='部门编号', unique=True, null=False)
    
        def __str__(self):
            return self.title
    View Code

    19.批量生成思想:

        def pach_init(self,request,queryset):
            temp=[]
            for course_obj in queryset:
    获取学生的列表          student_list=models.Student.objects.filter(class_list__id=course_obj.class_obj.id)
                for student in student_list:
                    obj=models.StudyRecord(student=student,course_record=course_obj)
                    temp.append(obj)
            models.StudyRecord.objects.bulk_create(temp)
        pach_init.desc='批量生成学生记录'
    
    
        actions = [pach_init,]
    批量生成方法

    20.构建数据

    b{'ret_ret_1':'ret111','not_not_1':'not1111','he_he_2':'he22222','ha_ha_2':'ha2222'}
    
    temp={}
    for i,value in b.items():
        key,id=i.rsplit('_',1)
        if id in temp:
            temp[id][key]=value
        else:
            temp[id]={key:value}
    print(temp)
    {'1': {'ret_ret': 'ret111', 'not_not': 'not1111'}, '2': {'he_he': 'he22222', 'ha_ha': 'ha2222'}}
    View Code

    21form表单字段查询model

            for bfield in form:
              if isinstance(bfield.field,ModelChoiceField):
          related_model=bfield.field.queryset.model #获取该form字段对应的model

     

  • 相关阅读:
    Python入门-函数进阶
    Python入门-初始函数
    Leetcode300. Longest Increasing Subsequence最长上升子序列
    Leetcode139. Word Break单词拆分
    Leetcode279. Perfect Squares完全平方数
    Leetcode319. Bulb Switcher灯泡开关
    Leetcode322. Coin Change零钱兑换
    二叉树三种遍历两种方法(递归和迭代)
    Leetcode145. Binary Tree Postorder Traversal二叉树的后序遍历
    Leetcode515. Find Largest Value in Each Tree Row在每个树行中找最大值
  • 原文地址:https://www.cnblogs.com/chenxuming/p/9317111.html
Copyright © 2011-2022 走看看