stark组件之处理函数动态url构造(五)
2024-08-31 16:40:13
在这个组件中有内置的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的生成。
最新文章
- Reporting Service 服务启动时报错The service did not respond to the start or control request in a timely fashion
- Fedora 21 64位系统安装WPS教程
- 解决umount.nfs: /data: device is busy 问题
- ML 07、机器学习中的距离度量
- 一个xib钟多个Cell
- Jdk内置性能测试工具的介绍
- c 函数调用产生的汇编指令和数据在内存情况(2)
- UIViewController
- c#Winform程序,让pictureBox显示图像(包含GIF),并且不被占用,能即时删除图片。
- ios实例开发精品源码文章推荐
- Android 监听屏幕锁屏,用户解锁
- Spring + JDK Timer Scheduler Example--reference
- html和css 基础梳理之一
- jsPlumb开发入门教程(实现html5拖拽连线)
- win10下安装Django
- java linux 项目经常无故被关闭 进程无故消息
- 哪些类继承了Collection接口
- 初入react-redux (基于webpack babel的react应用框架)
- 基于FeignClient提供简单的用户查询服务
- SQLite日期时间函数
热门文章
- bzoj 4276: [ONTAK2015]Bajtman i Okrągły Robin【线段树+最大费用最大流】
- ACM_求N^N的最高位数
- 题解报告:hdu 1261 字串数
- 安装11g 数据库
- 备份字段(CATALOGUE_CODE)
- 转 SQL*PLUS中的替换变量(&; &;&;)
- php中除法取整的方法(round,ceil,floor)
- [Luogu1848][USACO12OPEN]书架Bookshelf DP+set+决策单调性
- Nginx反向代理node,实现让静态文件在同一域
- 新浪qq登录