只是瞎猜,但也许有人能提出一些有趣的建议。
每当我在 View 中有forms 时,就会有很多if-else 语句,很难遵循逻辑。是否有一些模式或 python 语言功能来简化这个?从我记事起,我就遇到了这个问题,直到今天都没有找到好的解决方案。
这是一个示例:如果出现错误, View 将呈现相同的页面,如果一切正常,则进行搜索(在模型上)并返回包含图表的页面:
def analysis(request):
context = {'main_navigation' : 'analysis'}
context['no_results'] = False
template = 'analysis/analysis.html'
# Search params?
if not request.GET:
form = AnalysisSearchForm()
context['form'] = form
else:
form = AnalysisSearchForm(request.GET)
context['form'] = form
if form.is_valid():
# Do the search
results = form.search()
if len(results) > 0:
context['results'] = json.dumps(results, default=encode)
context.update(form.cleaned_data)
# Add the compare form
context['compare_form'] = CompareForm();
# Add critical level if there is one.
part = form.cleaned_data.get('part', None)
if part:
level = Level.get(part, "Default")
if level is not None:
context['level'] = level.value
template = 'analysis/analysis_graphs.html'
else:
context['no_results'] = True
return render_to_response(template, context,
context_instance=RequestContext(request))
如您所见,通过将所有查询逻辑移动到 form.search() 方法中,上述内容已经得到简化,该方法使用表单的 cleaned_data 来(在本例中)联系远程 API 并获取结果。
请您参考如下方法:
您看过基于类的 View (1.3 中的新功能)吗?您将 View 编写为类,并从多个基本 View 和混合中继承必要的功能。这意味着您可以将您的 View 分解成它们的组成部分并进行良好的代码分离:
https://docs.djangoproject.com/en/dev/topics/class-based-views/
此外,还有专门用于处理表单的 mixin:
https://docs.djangoproject.com/en/dev/ref/class-based-views/#formmixin
他们需要阅读一些内容才能充分利用它们,但我真的很喜欢它的实现,它看起来是解决您提到的一些问题的好方法。
