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

     

  • 相关阅读:
    POJ3213(矩阵乘法)
    jquery:ajax不接收返回值回
    Swift UI学习UITableView and protocol use
    也可以看看GCD(杭州电2504)(gcd)
    数据结构—队列
    HDU 4946 Area of Mushroom 凸包
    UVa 353
    照片教你eclipse通过使用gradle 打包Android
    普林斯顿大学公开课 算法1-8:并检查集合 高速查找
    Codeforces Round #246 (Div. 2)
  • 原文地址:https://www.cnblogs.com/chenxuming/p/9317111.html
Copyright © 2011-2022 走看看