stark - 3 ⇲自动生成URL及视图
以往建立了一张表,需要
1.为每张表创建4个url
2.为每张表创建4个视图函数
urlpatterns = [
url('^role/list/$',role.role_list,name='role_list'),
url('^role/add/$',role.role_add,name='role_add'),
url('^role/edit/(?P<pk>\d+)/$',role.role_edit,name='role_edit'),
url('^role/del/(?P<pk>\d+)/$',role.role_del,name='role_del'),
] 如果我们需要对大量的表进行这些操作,虽简单但是耗费时间和精力,且不保证细节会百分百正确。再有的是 程序狗为写重复的代码可耻!
现在:为app中的每个model类自动创建URL以及相关视图函数
def url(regex, view, kwargs=None, name=None):
return re_path(regex, view, kwargs, name)
url函数 源码
返回值主要参数为regex ,view
前面的StarkSite类中,同样是regex , view
if prev:
patterns.append(url(r'^%s/%s/%s/'%(app_name,model_name,prev),(handler.get_urls(),None,None)))
else:
patterns.append(url(r'^%s/%s/' % (app_name, model_name), (handler.get_urls(), None,None)))
prev前缀。(默认prev=None)使用者可以通过导入参数prev,实现正则不同前缀的url。
在StarkHandler类中get_urls生成相关视图函数:
def get_urls(self):
"""
生成视图函数
:return:
"""
patterns = [
url(r'^list/$', self.wapper(self.list_view), name=self.get_list_url_name),
url(r'^add/$', self.wapper(self.add_view), name=self.get_add_url_name),
url(r'^change/(?P<pk>\d+)/$', self.wapper(self.change_view), name=self.get_change_url_name),
url(r'^delete/(?P<pk>\d+)/$', self.wapper(self.delete_view), name=self.get_delete_url_name),
] patterns.extend(self.extra_urls())
return patterns
其中,各视图函数:
def list_view(self,request,*args,**kwargs):
###################### 处理action #####################
action_list = self.action_list
action_dict = {func.__name__:func.text for func in action_list}
if request.method == 'POST':
func_name = request.POST.get('action')
if func_name and func_name in action_dict: #逻辑优化,防止被 方法乱入
func = getattr(self,func_name)
func(request)
###################### 1.搜索(有值才会显示搜索框) #####################
search_list = self.get_search_list()
search_value = request.GET.get('q','')
from django.db.models import Q
conn = Q()
conn.connector = 'OR'
if search_value:
#Q,用于构造复杂的ORM查询条件
for item in search_list:
conn.children.append((item,search_value))
######################### 2.获取排序 ###############################
order_list = self.get_order_list()
#组合搜索条件字典
search_dict = self.get_search_group_condition(request)
#自定义方法筛选后的结果
queryset = self.get_queryset(**kwargs)
# print(queryset)
queryset = queryset.filter(conn).filter(**search_dict).all().order_by(*order_list)
###################### 3.处理分页(使用组件) #######################
all_count = queryset.count()
query_params = request.GET.copy() # ?=page=1&name='李四'
query_params._mutable = True #query_params['page']默认是不可以修改的
pager = Pagination(
current_page=request.GET.get('page'),
all_count=all_count,
base_url=request.path_info,
query_params=query_params,
per_page=self.per_page_count,
)
###################### 4.处理表格 ##############################
list_display = self.get_list_display()
# 4.1处理表头
header_list = []
if list_display:
for multi_key in list_display:
if isinstance(multi_key,FunctionType): #判断 传入值是否为函数
verbose_name = multi_key(self,obj=None,is_header=True)
else:
verbose_name = self.model_class._meta.get_field(multi_key).verbose_name
header_list.append(verbose_name)
else:
header_list.append(self.model_class._meta.model_name)
# 4.2处理表的内容
data_list = queryset[pager.start:pager.end]
body_list = []
for row in data_list: #row 是UserInfo object (1)
row_list = []
if list_display:
for multi_key in list_display:
if isinstance(multi_key,FunctionType):
row_list.append(multi_key(self,row,is_header=False,*args,**kwargs))
else:
row_list.append(getattr(row,multi_key)) #获取UserInfo object (1)的属性
else:
row_list.append(row)
body_list.append(row_list)
###################### 5.处理添加按钮 ##############################
add_btn = self.get_add_btn(**kwargs) #是一个URL
###################### 6.处理组合搜索 ##############################
search_group_row_list = []
search_group = self.get_search_group() # ['gender', 'depart']
for keyword_object in search_group: #keyword是一个Option类实例对象
row = keyword_object.get_queryset_or_tuple(self.model_class,request,*args,**kwargs)
#返回的是一个SearchGroupRow对象,且可迭代
search_group_row_list.append(row)
return render(request,
self.list_template or 'list.html',
{'body_list':body_list,
'header_list':header_list,
'pager':pager,
'add_btn':add_btn,
'search_list':search_list,
'search_value':search_value,
'action_dict':action_dict,
'search_group_row_list':search_group_row_list})
list_view
def add_view(self,request,*args,**kwargs):
"""
添加视图
:param request:
:return:
""" model_form = self.get_model_form()
if request.method == 'GET':
form = model_form
return render(request, 'change.html', {'form': form}) form = model_form(data=request.POST)
if form.is_valid():
response = self.save(request,form,False,*args,**kwargs)
return response or redirect(self.reverse_list_url(**kwargs))
return render(request,'change.html',{'form':form})
add_view
def change_view(self,request,pk,*args,**kwargs):
"""
编辑视图
:param request:
:param pk:
:return:
"""
checked_obj = self.get_change_object(request, pk, *args, **kwargs) if not checked_obj:
return render(request,'rbac\error.html') model_form = self.get_model_form()
if request.method == 'GET':
form = model_form(instance=checked_obj)
return render(request, 'change.html', {'form': form}) form = model_form(data=request.POST,instance=checked_obj)
if form.is_valid():
response = self.save(request, form, True, *args, **kwargs)
return response or redirect(self.reverse_list_url(**kwargs))
return render(request, 'change.html', {'form': form})
change_view
def delete_view(self,request,pk,*args,**kwargs):
"""
删除视图
:param request:
:param pk:
:return:
"""
checked_obj = self.model_class.objects.filter(pk=pk).first()
if not checked_obj:
return render(request,'rbac\error.html',) list_url = self.reverse_list_url(**kwargs)
if request.method == 'GET':
return render(request,'delete.html',{'list_url':list_url}) response = self.delete_object(request, pk, *args, **kwargs)
return response or redirect(list_url)
delete_view
以及生成各URL的别名:
def extra_urls(self):
return [] def get_url_name(self,param):
"""
返回别名(所有别名最后在这里处理)
:param param:
:return:
"""
app_name = self.model_class._meta.app_label
model_name = self.model_class._meta.model_name
if self.prev:
return '%s_%s_%s_%s' %(app_name,model_name,self.prev,param) #Web_customer_public_list
return '%s_%s_%s' %(app_name,model_name,param) @property
def get_list_url_name(self):
"""
获取列表页面URL的name
:return:
"""
return self.get_url_name('list') @property
def get_add_url_name(self):
"""
获取列表页面URL的name
:return:
"""
return self.get_url_name('add') @property
def get_change_url_name(self):
"""
获取列表页面URL的name
:return:
"""
return self.get_url_name('change') @property
def get_delete_url_name(self):
"""
获取列表页面URL的name
:return:
"""
return self.get_url_name('delete')
stark - 3 ⇲自动生成URL及视图的更多相关文章
- stark组件开发之自动生成URL
app01\model.py from django.db import models # Create your models here. class Depart(models.Model): i ...
- 爬虫之自动生成url
Object.extend=function(props){ //继承父类 var prototype=Object.create(this.prototype) //初始化函数ctor var _C ...
- stark组件(1):动态生成URL
项目启动时自动生成URL 效果图: 知识点: Django启动前通过apps下的ready方法执行一个可以生成URL的py文件 include函数主要返回有三个元素的一个元组.第一个是url配置(ur ...
- stark - 注册表、生成url
一.配置 stark组件开发,仿django自带得admin组件. 1. startapp stark 2. settings: 'stark.apps.StarkConfig' 3. 启动就执行 f ...
- ASP.NET MVC之视图生成URL(二)
前言 上一节我们讲述了MVC中从控制器到视图传递数据的四种方式,想必大家早已掌握了,那我们继续往下走. 话题 在MVC的Web应用程序中,我们经常会出现这样的操作,从一个视图跳转到另外一个视图,大部分 ...
- ASP.NET MVC之视图生成URL
在MVC的Web应用程序中,我们经常会出现这样的操作,从一个视图跳转到另外一个视图,大部分情况下都是通过链接来实现,当然这是一种非常不错的选择,为什么不说这是最好的选择呢?因为它也有其弊端,我们看看如 ...
- (转)php 根据url自动生成缩略图并处理高并发问题
分享是一种精神,与技术高低无关! 图片缩略图动态生成- [代码编程] 2011-08-23 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://www.blogbus.c ...
- 基于MVC4+EasyUI的Web开发框架经验总结(14)--自动生成图标样式文件和图标的选择操作
在很多Web系统中,一般都可能提供一些图标的选择,方便配置按钮,菜单等界面元素的图标,从而是Web系统界面看起来更加美观和协调.但是在系统中一般内置的图标样式相对比较有限,而且硬编码写到样式表里面,这 ...
- mybatis自动生成代码
使用maven集成mybatis-generator插件生成Mybatis的实体类,DAO接口和Map映射文件 本例中,使用的是mysql数据库 前提:表已经建好 mybatis框架的jar包,数据 ...
随机推荐
- json日期格式话
// 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位符, // 年(y)可以用 1-4 个占 ...
- 大数据时代,Python是最好的语言!
随着大数据疯狂的浪潮,新生代的工具Python得到了前所未有的爆发.简洁.开源是这款工具吸引了众多粉丝的原因.目前Python最热的领域,非数据分析和挖掘莫属了.从以Pandas为代表的数据分析领域开 ...
- 实践作业3:白盒测试----junit的难点DAY11.
本次白盒测试 需要独立完成整个项目和工具的配置安装运行操作,并编写.运行测试脚本,并完成实验的一些小细节等等. 首先,导入Junit测试框架所需的Jar包 然后编写测试脚本,为.java运行程序,见打 ...
- Windows下如何安装MongoDB
下载地址: http://www.mongodb.org/downloads 我下载的是:mongodb-win32-x86_64-2008plus-2.6.6 解压到:D:\soft 同时在该目录下 ...
- [GO]方法集
指针变量的方法集 package main import "fmt" type Person struct { name string sex byte age int } fun ...
- jQuary总结5:传递一个dom对象
1 传递一个dom对象 //html <div></div> <p id="p"></p> //js var p = documen ...
- 编写高质量代码改善C#程序的157个建议——建议123:程序集不必与命名空间同名
建议123:程序集不必与命名空间同名 程序集一般会和命名空间同名,但这并不是必须的.事实上,不同名的命名空间和程序集是很常见的. 程序集表示的是一种物理上的分组,而命名空间是逻辑上的分组,两者没有必然 ...
- java 基础语言: 方法
方法 格式: 修饰符 返回值类型 方法名(参数类型 参数名1, 参数类型 参数名2, ...) { 方法体; return 返回值; } 方法使用的注意事项: 1,方法不调用,自己不执行 2,方法中不 ...
- 深入理解java虚拟机(七)类加载的时机
Class 文件中描述的各种信息都必须加载到虚拟机中才能运行和使用.而虚拟机怎么加载这些Class 文件呢?Class 文件进入到虚拟机中会发生什么变化呢? 虚拟机类加载机制是指 虚拟机把描述类的数据 ...
- 【小梅哥FPGA进阶教程】MC8051软核在FPGA上的使用
十.MC8051软核在FPGA上的使用 本教程内容力求以详细的步骤和讲解让读者以最快的方式学会 MC8051 IP core 的应用以及相关设计软件的使用,并激起读者对 SOPC 技术的兴趣.本实验重 ...