Skip to main content
 首页 » 编程设计

python之简化 Django View 表单处理逻辑

2025年05月04日30yyy_WW

只是瞎猜,但也许有人能提出一些有趣的建议。

每当我在 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

他们需要阅读一些内容才能充分利用它们,但我真的很喜欢它的实现,它看起来是解决您提到的一些问题的好方法。