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包,数据 ...
随机推荐
- 修改字段注释modify
alter table test1 modify 字段名 类型 comment '修改后的字段注释'; ALTER TABLE tc_activity_miaosha MODIFY `validity ...
- [SoapUI] SoapUI+Groovy中"org.apache.xmlbeans.XmlException: error:
把 def holder = groovyUtils.getXmlHolder("Get Token#Response") 改为 def holder = groovyUtils. ...
- Greeplum 系列(四) 实战
Greeplum 系列(四) 实战 表结构 (1) 拉链表结构 create table public.member_fatdt0 ( member_id varchar(64), phoneno v ...
- Session分布式共享 = Session + Redis + Nginx(转)
出处:http://www.cnblogs.com/newP/p/6518918.html 一.Session 1.Session 介绍 我相信,搞Web开发的对Session一定再熟悉不过了,所以我 ...
- 常用的String方法Math方法
Arrays.sort();冒泡排序字符串.charAt(i);字符串索引i上的字符Integer.prsent(字符串) 字符串转整数equals(Object anObject) 将此字符串与指定 ...
- pig配置
下载Apache Pig 首先,从以下网站下载最新版本的Apache Pig:https://pig.apache.org/ 步骤1 打开Apache Pig网站的主页.在News部分下,点击链接re ...
- [respberry pi3][suse] 配置docker
[respberry pi3][suse] 配置docker arm64 suse上总的软件还是比较少的,特别是对32bit的一些支持,比较熟悉ubuntu,但是不能raspberry pi3没有64 ...
- 为web文件夹添加IIS应用程序池用户权限
在文件夹或文件右键属性—>安全——>编辑——>添加——>输入IIS APPPOOL\应用程序池名,确定即可将IIS 7或7.5.8的应用程序池虚拟用户添加到权限控制里面,然后再 ...
- 「HNOI 2013」游走
题目链接 戳我 \(Solution\) 首先申明几个变量: f[x]:到点x的概率, vis[x]:x点的度 dp[x][y]:(x,y)这条边的概率 number[x][y]:x这条边的编号 下面 ...
- Mayor's posters 线段树区间覆盖
题目链接 http://poj.org/problem?id=2528 Description The citizens of Bytetown, AB, could not stand that t ...