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)
组件知识点总结:
1.路由分发
2.单例模式
3.如何通过模型类--->获得模型字符串名称,该模型所在的 app名称
model <class 'repository.models.Book'>: --->repository/book model_name=model._meta.model_name #打印出该模型的名称 app_namemodel._meta.app_label #打印出该模型的app的名称
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文件
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
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
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
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
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
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();
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
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'}}
21form表单字段查询model
for bfield in form: if isinstance(bfield.field,ModelChoiceField): related_model=bfield.field.queryset.model #获取该form字段对应的model