以往建立了一张表,需要

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及视图的更多相关文章

  1. stark组件开发之自动生成URL

    app01\model.py from django.db import models # Create your models here. class Depart(models.Model): i ...

  2. 爬虫之自动生成url

    Object.extend=function(props){ //继承父类 var prototype=Object.create(this.prototype) //初始化函数ctor var _C ...

  3. stark组件(1):动态生成URL

    项目启动时自动生成URL 效果图: 知识点: Django启动前通过apps下的ready方法执行一个可以生成URL的py文件 include函数主要返回有三个元素的一个元组.第一个是url配置(ur ...

  4. stark - 注册表、生成url

    一.配置 stark组件开发,仿django自带得admin组件. 1. startapp stark 2. settings: 'stark.apps.StarkConfig' 3. 启动就执行 f ...

  5. ASP.NET MVC之视图生成URL(二)

    前言 上一节我们讲述了MVC中从控制器到视图传递数据的四种方式,想必大家早已掌握了,那我们继续往下走. 话题 在MVC的Web应用程序中,我们经常会出现这样的操作,从一个视图跳转到另外一个视图,大部分 ...

  6. ASP.NET MVC之视图生成URL

    在MVC的Web应用程序中,我们经常会出现这样的操作,从一个视图跳转到另外一个视图,大部分情况下都是通过链接来实现,当然这是一种非常不错的选择,为什么不说这是最好的选择呢?因为它也有其弊端,我们看看如 ...

  7. (转)php 根据url自动生成缩略图并处理高并发问题

    分享是一种精神,与技术高低无关!   图片缩略图动态生成- [代码编程] 2011-08-23 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://www.blogbus.c ...

  8. 基于MVC4+EasyUI的Web开发框架经验总结(14)--自动生成图标样式文件和图标的选择操作

    在很多Web系统中,一般都可能提供一些图标的选择,方便配置按钮,菜单等界面元素的图标,从而是Web系统界面看起来更加美观和协调.但是在系统中一般内置的图标样式相对比较有限,而且硬编码写到样式表里面,这 ...

  9. mybatis自动生成代码

    使用maven集成mybatis-generator插件生成Mybatis的实体类,DAO接口和Map映射文件 本例中,使用的是mysql数据库 前提:表已经建好  mybatis框架的jar包,数据 ...

随机推荐

  1. noi2729 Blah数集

    Blah数集 大数学家高斯小时候偶然间发现一种有趣的自然数集合Blah,对于以a为基的集合Ba定义如下: (1) a是集合Ba的基,且a是Ba的第一个元素: (2)如果x在集合Ba中,则2x+1和3x ...

  2. .net 自定义AOP,透明代理与真实代理

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.R ...

  3. redis集群部署及常用的操作命令(下)

    搭建好集群之后,为了扩容需要再加入一个节点.那就再复制一个7006,改为相应的redis.conf(复制了改个port就好,如果复制的redis之前属于集群,需要把关联的node.conf之类的去掉) ...

  4. rocketmq配置项说明(对应版本:4.0.0-incubating)

    Broker配置参数说明 自定义客户端行为 ※一些默认配置的源代码路径 org.apache.rocketmq.store.config --END--

  5. 基于保守性和规则性的预测方法SIFT和PolyPhen

    有什么特征可以帮助我们来区分导致功能和表型变化的变异和其他变异,然后我们如何综合特征来做出一个预测模型? 表型或功能的改变(phenotypical/functional effect)a,个体表型上 ...

  6. NBA常识 位置的划分 足球:越位等于抢跑

    篮球:1号位——组织后卫(控球,组织)2号位——得分后卫(中远投篮,突破)3号位-----小前锋(突破,中远投篮)4号位——大前锋(二中锋,篮板,背身单打,禁区防守)5号位——中锋(篮板.背身单打,禁 ...

  7. Unity热更新技术整理

    一.热更新学习介绍 1.什么是热更新 举例来说: 游戏上线后,玩家下载第一个版本(70M左右或者更大),在运营的过程中,如果需要更换UI显示,或者修改游戏的逻辑,这个时候,如果不使用热更新,就需要重新 ...

  8. Reactor模式和NIO(转载二)

    本文可看成是对Doug Lea Scalable IO in Java一文的翻译. 当前分布式计算 Web Services盛行天下,这些网络服务的底层都离不开对socket的操作.他们都有一个共同的 ...

  9. 一些linux工具在windows版本下的文件放置位置

    首先说明一下windows下的常用变量(这里是XP的,win7及以上的C:\Documents and Settings实际为C:\Users) %SystemDrive%        操作系统所在 ...

  10. 使用Amazon Simple Queue Service(SQS) 实现简单的消息服务

    一  引言 亚马逊Amazon作为云计算的领跑者推出了很多云服务,最近因为项目的原因,需要用到SQS服务,因此简要地写下这篇随笔,一来方便以后查阅,二来方便共享一些简单的操作. SQS即可以理解为一个 ...