博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
stark组件之处理函数动态url构造(五)
阅读量:5297 次
发布时间:2019-06-14

本文共 3963 字,大约阅读时间需要 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
\d+)/change/$', self.wrapper(self.change_view), name=self.get_edit_url_name), re_path('(?P
\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("订单记录"%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的生成。

转载于:https://www.cnblogs.com/shenjianping/p/10910719.html

你可能感兴趣的文章
「 Luogu P2285 」打鼹鼠
查看>>
lua语言入门之Sublime Text设置lua的Build System
查看>>
解决win8使用内置管理员不能打开应用商城、天气等问题
查看>>
vue.js基础
查看>>
电脑的自带图标的显示
查看>>
globalization与全球化
查看>>
[转载] redis 的两种持久化方式及原理
查看>>
关于在Idea 创建Maven项目时,无法在source文件下创建servlet文件问题解决!
查看>>
对 HTTP 304 的理解
查看>>
深入理解css中的margin属性
查看>>
C++ 删除字符串的两种实现方式
查看>>
电容选型
查看>>
ORA-01502: 索引'P_ABCD.PK_WEB_BASE'或这类索引的分区处于不可用状态
查看>>
Spring EL hello world实例
查看>>
百度地图API地理位置和坐标转换
查看>>
MyBatis学习总结(六)——调用存储过程
查看>>
code-代码平台服务器路径
查看>>
离线安装 Visual Studio Express 而不下载整个镜像文件的方法(转载)
查看>>
2017-2018-2偏微分方程复习题解析10
查看>>
Java抽象类和接口的比较
查看>>