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

 

 

posted @ 2018-07-16 12:36  R00M  阅读(862)  评论(0编辑  收藏  举报