ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

stark组件之处理函数动态url构造(五)

2019-05-23 13:40:41  阅读:246  来源: 互联网

标签:return name get url self stark kwargs 处理函数


在这个组件中有内置的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的生成。

标签:return,name,get,url,self,stark,kwargs,处理函数
来源: https://www.cnblogs.com/shenjianping/p/10910719.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有