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=''
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': [''], '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)
{'': {'ret_ret': 'ret111', 'not_not': 'not1111'}, '': {'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

Django之stark组件的使用和总结的更多相关文章

  1. 【django之stark组件】

    一.需求 仿照django的admin,开发自己的stark组件.实现类似数据库客户端的功能,对数据进行增删改查. 二.实现 1.在settings配置中分别注册这三个app # Applicatio ...

  2. django 之 stark组件

    ----------------------------------------------------------------烦恼没完没了,内心动荡不安,呜呼哀哉. 一.有个特殊的需求,需要用sta ...

  3. Django之stark组件

    现在让我说啥是stark组件,我也说不清楚.反正从今天讲的知识来看,今天完成的就是自己写一个模块,这个模块包含了admin后台管理工具的一些比较好用的功能,我们把它提炼出来,也就是相当于自己写一个ad ...

  4. Django之stark组件1

    stark组件 stark组件是根据Django admin为原型写的一个组件,能够让我们告别增删改查.stark组件是可插拔试的组件, 移植性强,而且只用配置文件就能够得到想要的数据 一.stark ...

  5. Django之stark组件2

    action批量处理功能 用户可以自定义批量处理功能,但是默认的有批量删除功能. ***思路*** 1,定义一个列表用来装action的类名并extend用户自定义列表 2.循环该列表获取到函数名(用 ...

  6. stark组件之pop操作【模仿Django的admin】

    一.先看下什么django的admin的pop到底是个什么东西 其实就是这么一个东西, a.在添加页面,在一对多和多对多的项后加了一个+号 b.点击这个加号,会弹出对应的添加 页面,在新的添加 c.添 ...

  7. stark组件之批量操作【模仿Django的admin】

    一.先看下django的admin是如何实现批量操作 首先在配置类中定义一个函数 然后我们为这个函数对象设置一个属性,这个属性主要用来显示在select标签中显示的文本内容 最后把函数对象放到一个ac ...

  8. stark组件之搜索【模仿Django的admin】

    一.先看下django的admin是如何做搜索功能的 配置一个search_fields的列表就可以实现搜索的功能 class testbook(admin.ModelAdmin): # 第一步,定义 ...

  9. stark组件之路由分发【模仿Django的admin】

    一.先看下django的admin是如何进行路由分发的 1.先看下django的admin的url路径有哪些 其实很简单,假如有一个书籍表,那么每张表对应四个url,增.删.改.查 查看的url ht ...

随机推荐

  1. 使用RAP搭建前端Mock Server

    转载自:<前后端分离--构建前端Mock Server--windows部署rap>http://www.cnblogs.com/dothin/p/5361883.html mock:模拟 ...

  2. Centos 7 搭建OpenStack 私有云——(1)基础环境配置

    1.简介: OpenStack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目. OpenStack是一个开源的云计算管理 ...

  3. Python内置模块和第三方模块

    1.Python内置模块和第三方模块 内置模块: Python中,安装好了Python后,本身就带有的库,就叫做Python的内置的库. 内置模块,也被称为Python的标准库. Python 2.x ...

  4. javascript 模块引擎 (手写草稿)

    1.试题: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  5. 【BIEE】06_UNION /UNION ALL集合中分类汇总求和占比字段特殊处理

    环境准备 基于[BIEE]04..中建立的事实表 通过UNION ALL后得到如下报表: 优秀员工薪水公式:CASE WHEN "EMP_FACT"."级别"= ...

  6. Java编程手冊-Collection框架(上)

    该文章所讲内容基本涵盖了Collection里面的全部东西,尽管基于jdk 1.5的.可是思路非常清晰 1.引言 1.1 Collection框架的介绍 尽管我们能够使用数组去存储具有同样类型的元素集 ...

  7. poj3411--Paid Roads(bfs+状压)

    题目链接:id=3411">点击打开链接 题目大意:有n个点.m条有向边,经过边须要一个花费,a b c p q代表 a到b的一条道路,假设经过这条边之前经过c点,那么须要p的花费,否 ...

  8. 【MIG专项测试组】如何准确评测Android应用的流畅度?

    转自 腾讯Bugly 叶方正,2008年加入腾讯,就职于无线研发部[专项测试组].曾经负责多个产品的性能优化工作,积累大量的移动终端平台优化以及评测经验. 怎样获取SM值? 前文我们分析了通过测量应用 ...

  9. X264学习1:简介

    H.264是视频编码标准. X264是它的开源实现,是视频编码器. 目录 [隐藏]  1 编码器特性 2 输入输出文件类型 2.1 输入 2.2 输出 3 preset和tune系统 3.1 --pr ...

  10. XtraBackup备份mysql5.1.73

    一.基础介绍 mysql5.1在源码中配备了两个版本的innodb存储引擎源码:innobase和innodb_plugin,编译安装的时候可以通过参数--with-plugins=innobase, ...