在这个项目的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了。