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. [Functional Programming] Compose Simple State ADT Transitions into One Complex Transaction

    State is a lazy datatype and as such we can combine many simple transitions into one very complex on ...

  2. 使用Fiddler作为简单的mockserver

    转载:  http://blog.csdn.net/xt0916020331/article/details/66544526 开发中经常遇到调试过程中对接系统接口无法联调或者后台未开发完成等情况.这 ...

  3. Visual Studio 外请版本号管理插件 - AnkhSVN

    Visual Studio 外请版本号管理插件 - AnkhSVN 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致 ...

  4. 一扫天下——ZXing使用全解析

    一扫天下--ZXing使用全解析 二维码如今已经烂App了,无论什么App.没有二维码就好像低人一等了. 所以,在自己的项目中集成二维码功能还是非常有必要的. 网上非常多都是基于ZXing2.3的.可 ...

  5. BaseAdapter的使用(笔记)

    适配器模式的应用: 1.减少程序耦合性 2.easy扩展 BaseAdapter ListView的显示与缓存机制:须要才显示,显示完就被会受到缓存. BaseAdapter基本结构 --public ...

  6. 打造Android万能上拉下拉刷新框架--XRefreshView(三)

    转载请注明出处:http://blog.csdn.net/footballclub/ 打造Android万能上拉下拉刷新框架–XRefreshView(一) 打造Android万能上拉下拉刷新框架–X ...

  7. 【SpringMVC学习05】SpringMVC中的参数绑定总结——较乱后期准备加入 同一篇幅他人的参数绑定

    众所周知,springmvc是用来处理页面的一些请求,然后将数据再通过视图返回给用户的,前面的几篇博文中使用的都是静态数据,为了能快速入门springmvc,在这一篇博文中,我将总结一下springm ...

  8. myeclipse svn安装

    安装subclipse, SVN 插件 1.从官网下载site-1.6.9.zip文件,网址是:subclipse.tigris.org, 2.从中解压出features与plugins文件夹,复制到 ...

  9. int byte转换

    //命令码0x8001转为int为32769,发送时反序 ] { 0x01, 0x80 }; ); //int to byte[] ; byte[] b = BitConverter.GetBytes ...

  10. storm RollingTopWords 实时top-N计算任务窗口设计

    转发请注明原创地址 http://www.cnblogs.com/dongxiao-yang/p/6381037.html 流式计算中我们经常会遇到需要将数据根据时间窗口进行批量统计的场景,窗口性质一 ...