在这个组件中有内置的4个处理函数,它们都有自己对应的url,那么它们的url是怎么构造的呢?

...

urlpatterns = [
re_path('list/$', self.wrapper(self.changelist_view), name=self.get_list_url_name ),
re_path('add/$', self.wrapper(self.add_view), name=self.get_add_url_name),
re_path('(?P<pk>\d+)/change/$', self.wrapper(self.change_view), name=self.get_edit_url_name),
re_path('(?P<pk>\d+)/del/$', self.wrapper(self.del_view), name=self.get_del_url_name), ]
...

可以看出来,都是根据url的name反向解析生成对应的url。先changelist_view这个函数为例进行说明。

    @property
def get_list_url_name(self):
return self.get_url_name('changelist') def get_url_name(self,param):
app_label = self.model_class._meta.app_label
model_name = self.model_class._meta.model_name
if self.prev:
name='%s_%s_%s_%s' % (app_label, model_name,self.prev,param)
else:
name='%s_%s_%s' % (app_label, model_name,param)
return name

在这里它的name就是命名空间+app名字+model名字+前缀+参数+changelist,前缀就是之前提到_registry={}换成_registy=[]用于区别同一个model产生不同页面进行区别的,而参数是干什么的呢?这里支持不仅可以用这内置的四个函数,而且也可以支持自己自定义自己的函数。

    def get_urls(self):
urlpatterns = [
re_path('audit/$', self.wrapper(self.changelist_view), name=self.get_url_name('audit_list') ),
]
extra_urls = self.extra_urls() if extra_urls:
urlpatterns.extend(extra_urls) return urlpatterns

看见没,audit_list就是参数,自己自定义的url name,这就形成了多个url访问同一个changlist_view函数,但是可以通过list_display等功能控制具体显示什么。这就是url name的构建。接下来就是怎么反向生成url了。

    def reverse_changelist_url(self,*args,**kwargs):
namespace = self.site.namespace
list_url = reverse('%s:%s' % (namespace, self.get_list_url_name),args=args,kwargs=kwargs)
origin_url = self.request.GET.get(self.back_condition_key) if not origin_url:
return list_url list_url = "%s?%s" % (list_url, origin_url) # /stark_config/app01/userinfo/list/?q=k
return list_url

这是反向生成列表页的url,将生成的列表页的url name反向解析,可能有的人要问了为什么后面会有*args以及**kwargs参数,看一个例子就明白了。

    def display_order(self, row=None, header_body=False,*args,**kwargs):
if not header_body:
return '订单记录'
url = reverse("stark:crm_order_changelist",kwargs={'customer_id':row.pk}) #注意小写表名
return mark_safe("<a href='%s'>订单记录</a>"%url)

这样避免了在url后面加?进行传值,相对来说简单一些。另外注意到了吗,这里还有保存上一次请求参数的功能。

 origin_url = self.request.GET.get(self.back_condition_key) 

这就是列表页url的构建,其余的就是编辑、删除、修改页面url的构建。

    def get_url_name(self,param):
app_label = self.model_class._meta.app_label
model_name = self.model_class._meta.model_name
if self.prev:
name='%s_%s_%s_%s' % (app_label, model_name,self.prev,param)
else:
name='%s_%s_%s' % (app_label, model_name,param)
return name @property
def get_edit_url_name(self):
return self.get_url_name('change') @property
def get_add_url_name(self):
return self.get_url_name('add') @property
def get_del_url_name(self):
return self.get_url_name('del')

反向解析url

   def reverse_edit_url(self,*args,**kwargs):
return self.reverse_common_url(self.get_edit_url_name,*args,**kwargs) def reverse_del_url(self,*args,**kwargs): return self.reverse_common_url(self.get_del_url_name,*args,**kwargs) def reverse_add_url(self,*args,**kwargs): return self.reverse_common_url(self.get_add_url_name,*args,**kwargs)
    def reverse_common_url(self,name,*args,**kwargs):
common_name = "%s:%s" % (self.site.namespace, name,)
base_url = reverse(common_name,args=args,kwargs=kwargs)
if not self.request.GET:
com_url=base_url
else:
param_str = self.request.GET.urlencode()
new_query_dict = QueryDict(mutable=True)
new_query_dict[self.back_condition_key] = param_str
com_url = "%s?%s" % (base_url, new_query_dict.urlencode(),)
return com_url

这样就完成各个视图函数动态url的生成。

stark组件之处理函数动态url构造(五)的更多相关文章

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

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

  2. stark组件(2):提取公共视图函数、URL分发和设置别名

    效果图: Handler类里处理的增删改查.路由分发.给URL设置别名等包括以后还要添加的很多功能,每一个数据库的类都需要,所以我们要把Handler提取成一个基类.提取成基类后,每一个数据表都可以继 ...

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

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

  4. stark组件配置,二层URL

    1.django的admin配置 2 stark组件开发 3.2层url分发 4.小结 1.django的admin配置 model.py from django.db import models # ...

  5. stark 组件 url 二级分发的实现

    模拟 admin 组件url设计思路 项目urls 文件中: from django.contrib import admin from django.urls import path from st ...

  6. 7 stark组件介绍、配置、2层url

    1.django的admin配置 model.py from django.db import models # Create your models here. class UserInfo(mod ...

  7. stark组件的分页,模糊查询,批量删除

    1.分页组件高阶 2.整合展示数据showlist类 3.stark组件之分页 3.stark组件之search模糊查询 4.action批量处理数据 4.总结 1.分页组件高阶 1.分页的class ...

  8. stark组件之创建

    stark组件之需求 仿照Django中的admin , 开发了自己的stark组件,实现类似数据库客户端的功能,对数据进行增删改查 . stark之创建 1.在项目中 创建stark应用,app01 ...

  9. 24.stark组件全部

    admin组件: 博客里面的图片的是在太难弄了,有大哥会弄给我贴一片博客,我一个一个加太累了,没有加 admin参考:https://www.cnblogs.com/yuanchenqi/articl ...

随机推荐

  1. [Swift通天遁地]一、超级工具-(5)使用UIWebView(网页视图)加载本地页面并调用JavaScript(脚本)代码

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  2. Luogu P1073 最优贸易【最短路/建反图】 By cellur925

    题目传送门 这么经典的题目,还是看了lyd的题解....唉难过. 一句话题意:在一张点有全都的图上找一条从1到n的路径,存在两个点p,q(p<q),使val[q]-val[p]最大. 给出的图是 ...

  3. tableView 顶部多出一部分解决方法

    1.self.automaticallyAdjustsScrollViewInsets = NO; 此方法解决之后 不能保证tableView 能彻底的滑动到底部 2. self.edgesForEx ...

  4. WIN32 API ------ 最简单的Windows窗口封装类

    1 开发语言抉择 1.1 关于开发Win32 程序的语言选择 C还是C++ 在决定抛弃MFC,而使用纯Win32 API 开发Window桌面程序之后,还存在一个语言的选择,这就是是否使用C++.C+ ...

  5. matlab学习路线

    知乎:matlab学习路线 MATLAB数学教学视频

  6. Hackonacci Matrix Rotations 观察题 ,更新了我的模板

    https://www.hackerrank.com/contests/w27/challenges/hackonacci-matrix-rotations 一开始是没想到观察题的.只想到直接矩阵快速 ...

  7. Spring注解驱动开发之AOP

    前言:现今SpringBoot.SpringCloud技术非常火热,作为Spring之上的框架,他们大量使用到了Spring的一些底层注解.原理,比如@Conditional.@Import.@Ena ...

  8. esp8266 串口通讯

    1.发送 调用uart_init(115200,115200);初始化串口,波特率设置为115200.前面一个是设置uart0的波特率.后面一个是设置.uart的波特率 然后就可以使用uart0_tx ...

  9. 5 Transforms 转移 笔记

    5 Transforms 转移 笔记   Transforms    Unfortunately, no one can be told what the Matrix is. You have to ...

  10. InChatter系统之服务器开发(一)

    服务器端是整个消息系统的中枢,类似与人类的大脑.没有他,根本无法实现客户端之间的交流,为什么呢?这也涉及到我们的系统涉及,在服务器端,每个客户端的标识数据都会在服务器端进行保存,在这种情况下,当某一个 ...