在写场地申请代码的时候,会经常遇到一些怎么组织代码的问题,由于在设计这方面比较无脑,里面一些问题感觉没有很好地解决,恨当时都没有及时记录下来....
所以趁着现在在对代码还有一点记忆,我打算把他们记录下来,希望各位师兄能指点下。
场地申请代码在http://git.oschina.net/doyoubi/field-application/tree/develop/field_application/field_application
换届之后会放到一个公共仓库里面。
场地申请按场地分成四个板块,学活,展览场地,露天场地,会议室。
四个场地的功能都包括,列出所有申请,提交申请,修改申请。如果某个地方需要修改,一般要四份代码一起修改。= =我在这里吃了很多苦头,修改dulplicate的非常繁琐,而且非常容易出错。(可以看下两个场地的
ListAppView)
拿
ListAppView来说,两个场地的代码,不同的地方就 model, form, 还有一些返回信息。其它基本是一样的。我曾经想过按c++的模板的想法,将这些东西都弄成参数。具体做法是将这些写控制器代码的class放在一个函数里面,然后让这个函数接受这些model,form作为参数,然后让这个函数返回这些class。
- def GenericViewClassFactory(model, form, msg):
- class ListAppView(View):
- def get(request):
- # use model, form, msg
- def post(request):
- # use model, form, msg
- return ListAppView
验证逻辑(业务逻辑)不放在form里面,而应放在其他地方,因为这样会把验证逻辑 跟 如何处理 “已经太多人申请”的逻辑混在一起。
for time in self.cleaned_data['time']:
if len(MeetingRoomApplication.objects.filter(
place=self.cleaned_data.get('place'),
date=self.cleaned_data.get('date'),
time__contains=time)) > 2:
msg = time + u'已有过多人申请'
self._errors['time'] = self.error_class([msg])
del self.cleaned_data['time']
break