url name的统一格式设计

在这个项目的20多个模型中,都需要使用查看列表,新建对象,查看对象详情,编辑对象,删除对象这5个方法,对应的需要有这5个view函数。

以Project来举例,定义url如下(delet暂时没有去实现)

urlpatterns = [
    path('list/<str:program_id>', views_project.view_project_list, name='view_project_list'),
    path('add/<str:program_id>', views_project.view_project_add,name='view_project_add'),
    path('edit/<str:project_id>', views_project.view_project_edit,name='view_project_edit'),
    path('info/<str:project_id>', views_project.view_project_info,name='view_project_info'),
      
]

每个url,都定义了一个name,这个name和view的名字相同(也可以不相同)。

按一般做法,在Project这个model里,定义一个function 叫 get_absolute_url。为了简化,我的项目里把get_absolute_url换成了get_url

    def get_url(self):        
         url = reverse("tcm:view_project_info", args=(self.id,)) 
         return url

那么Project的一个对象就可以调用 get_url得到自己的详情页的url,在html里也可以直接调用get_url,非常方便。

除了get_url外,我们还可以继续定义get_edit_url,get_del_url,get_next_url(下一个对象详情url)和get_pre_url(上一个对象详情url)。

统一到CommonModel

上面讲到,因为项目中model有20多个了,每个model里都要定义上面几个function,不是不可以,就是觉得有点不爽,于是又想办法整合了一下。

1. 统一所有model的url的name的格式,都为view_xxx_aaa,其中xxx为Model类名,并且首字母修改为小写。aaa为动作,如info,edit,delete,add,list。

在CommonModel中定义function如下

class CommonModel(BaseModel):
    def view_key(self):
        class_name = self.get_contentType().model_class().__name__
        class_name = class_name[0].lower() + class_name[1:]
        # print("class_name=",class_name)
        return class_name

    def get_url(self):        
        try:
            url_name = "tcm:view_%s_info" %self.view_key()
            url = reverse(url_name, args=(self.id,)) 
            return url
        except Exception as err:
            ccom_log_error(err)
            return ""  

    def get_edit_url(self):
        try:
            url_name = "tcm:view_%s_edit" %self.view_key()        
            return reverse(url_name, args=(self.id,))   
        except Exception as err:
            ccom_log_error(err)
            return ""
    
    def get_del_url(self):
        try:
            url_name = "tcm:view_%s_del" %self.view_key()        
            url = reverse(url_name, args=(self.id,)) 
            return url
        except Exception as err:
            # ccom_log_error(err)
            return ""

    def get_next_url(self):
        try:
            return self.get_next().get_url()
        except Exception as err:
            ccom_log_error(err)
            return ""  
        
    def get_prev_url(self):
        try:
            return self.get_prev().get_url()  
        except Exception as err:
            ccom_log_error(err)
            return ""  

如此一来,只要model继承CommonModel,url的name按统一格式写,就不用再重写get_url这些function了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值