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=''
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组件的使用和总结的更多相关文章
- 【django之stark组件】
一.需求 仿照django的admin,开发自己的stark组件.实现类似数据库客户端的功能,对数据进行增删改查. 二.实现 1.在settings配置中分别注册这三个app # Applicatio ...
- django 之 stark组件
----------------------------------------------------------------烦恼没完没了,内心动荡不安,呜呼哀哉. 一.有个特殊的需求,需要用sta ...
- Django之stark组件
现在让我说啥是stark组件,我也说不清楚.反正从今天讲的知识来看,今天完成的就是自己写一个模块,这个模块包含了admin后台管理工具的一些比较好用的功能,我们把它提炼出来,也就是相当于自己写一个ad ...
- Django之stark组件1
stark组件 stark组件是根据Django admin为原型写的一个组件,能够让我们告别增删改查.stark组件是可插拔试的组件, 移植性强,而且只用配置文件就能够得到想要的数据 一.stark ...
- Django之stark组件2
action批量处理功能 用户可以自定义批量处理功能,但是默认的有批量删除功能. ***思路*** 1,定义一个列表用来装action的类名并extend用户自定义列表 2.循环该列表获取到函数名(用 ...
- stark组件之pop操作【模仿Django的admin】
一.先看下什么django的admin的pop到底是个什么东西 其实就是这么一个东西, a.在添加页面,在一对多和多对多的项后加了一个+号 b.点击这个加号,会弹出对应的添加 页面,在新的添加 c.添 ...
- stark组件之批量操作【模仿Django的admin】
一.先看下django的admin是如何实现批量操作 首先在配置类中定义一个函数 然后我们为这个函数对象设置一个属性,这个属性主要用来显示在select标签中显示的文本内容 最后把函数对象放到一个ac ...
- stark组件之搜索【模仿Django的admin】
一.先看下django的admin是如何做搜索功能的 配置一个search_fields的列表就可以实现搜索的功能 class testbook(admin.ModelAdmin): # 第一步,定义 ...
- stark组件之路由分发【模仿Django的admin】
一.先看下django的admin是如何进行路由分发的 1.先看下django的admin的url路径有哪些 其实很简单,假如有一个书籍表,那么每张表对应四个url,增.删.改.查 查看的url ht ...
随机推荐
- Android学习(二十二)ContentMenu上下文菜单
一.上下问菜单 在某个菜单项上长按,会弹出一个菜单,这个就是上下文菜单.有点类似与Windows系统中的右键菜单. 二.上下文菜单的内容 1.标题 2.图标 3.菜单项 4.对应的菜单事件 三.Opt ...
- react-native 项目实战 -- 新闻客户端(1) -- 初始化项目结构
1.在项目根目录新建Componet文件夹(专门用来放我们的自定义组件),里面新建Main.js.Home.js.Message.js.Mine.js.Find.js 2.修改 index.andro ...
- 关于其它模块的设计,有非常多须要自己去构建和完毕,在这里就简单地举几个样例来看看其它模块的设计。我们要做的就是有更改password模块,客户选择模块和关于本软件模块。更改password模块用来更改管理员的password,客户选择对话框模块用来选择已加入的客户,关于本软件模块用来说明客户管理系统的一些必要信息和制作人的信息。
五,其它模块设计 关于其它模块的设计,有非常多须要自己去构建和完毕,在这里就简单地举几个样例来看看其它模块的设计. 我们要做的就是有更改password模块.客户选择模 ...
- 一个队列类的实现(比delphi自带的速度快70倍)(线程安全版本)
unit sfContnrs; interface {$DEFINE MULTI_THREAD_QUEUE} //线程安全版本,如果不需要线程安全,请注释掉此行代码 {$IFDEF MULTI_THR ...
- 如何去掉MapReduce输出的默认分隔符
我们在用MapReduce做数据处理的时候,经常会遇到将只需要输出键或者值的情况,如context.write(new Text(record), new Text("")),这样 ...
- Hibernate学习之单向一对多映射
© 版权声明:本文为博主原创文章,转载请注明出处 说明:该实例是通过映射文件和注解两种方式实现的.可根据自己的需要选择合适的方式 实例: 1.项目结构 2.pom.xml <project xm ...
- oracle中过滤中文字符或者汉字的函数
CREATE OR REPLACE FUNCTION GET_CHINESE(P_NAME IN VARCHAR2) RETURN VARCHAR2 IS V_CODE VARCHAR2 ...
- [转]Ubuntu Server命令行更换软件源
sucd /etc/aptwget http://mirrors.163.com/.help/sources.list.lucidmv sources.list sources.list.backup ...
- centos6.5安装Apache+MySQL+PHP
一.安装 MySQL 首先来进行 MySQL 的安装.打开超级终端,输入: [root@localhost ~]# yum install mysql mysql-server 安装完毕,让 MySQ ...
- Android使用LinearViewLayout展示数据
如果要滚动,使用ScrollView来包裹这个LinearViewLayout. ListView控件,自己带有滚动效果的. BaseAdapter LayoutInflater 其他两种绑定方式 A ...