Python 简化Django视图表单处理逻辑

Python 简化Django视图表单处理逻辑,python,django,Python,Django,只是在黑暗中拍摄,但也许有人能提出一些有趣的建议 在我看来,每当我有表单时,就会有很多if-else语句,很难遵循逻辑。是否有一些模式或python语言特性可以简化这一点?从我记事起,我就一直有这个问题,至今还没有找到好的解决办法 下面是一个示例:如果有错误,视图将呈现相同的页面,如果一切正常,则执行搜索(在模型上)并返回包含图形的页面: def analysis(request): context = {'main_navigation' : 'analysis'} conte

只是在黑暗中拍摄,但也许有人能提出一些有趣的建议

在我看来,每当我有表单时,就会有很多if-else语句,很难遵循逻辑。是否有一些模式或python语言特性可以简化这一点?从我记事起,我就一直有这个问题,至今还没有找到好的解决办法

下面是一个示例:如果有错误,视图将呈现相同的页面,如果一切正常,则执行搜索(在模型上)并返回包含图形的页面:

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()方法中,上述操作已经得到简化,该方法使用表单的已清理数据(在本例中)联系远程API并获取结果。

这里我将如何做(通过小的更改和跳跃,我没有破坏函数逻辑):


您看过基于类的视图了吗(1.3中新增)。您可以将视图作为类编写,并从多个基本视图继承必要的功能性,还可以进行混合。这意味着您可以将视图分解为其组成部分,并进行良好的代码分离:

此外,还有专门用于处理表格的混合器:


它们需要一些阅读来充分利用它们,但我真的很喜欢它的实现,而且它看起来是克服您提到的一些问题的好方法

是的,很有趣。。。但如果表单是空的,它会有效吗?在初始页面加载时不会显示错误吗?@drozzy:AFAIK空表单总是无效的,您可以在python cli中检查它:
from django.forms import from;print Form().is_valid()
我将返回False。但是返回“invalid Form”和“initial empty Form”是有区别的-在后一种情况下,页面上应该没有错误。您可以获取一条if语句的内容,并将其作为单独的函数进行分解。哇,这看起来很有趣!现在阅读基于类的视图页面。你使用表单混合器吗?它们的一个示例用例是什么?我使用基于类的视图,但我还没有完成表单。一个示例用例是您在视图中处理表单的任何时候!陛下我很难理解它是如何适用于我的。看起来mixin做了很多重定向——而在我的例子中,它都在GET方法中,还有很多if语句。。。
# XXX: Use Dependency injection with the template file.
def analysis(request, template='analysis/analysis.html'): 
    context = {'main_navigation' : 'analysis'}
    context['no_results'] = False

    # XXX: Create only one form here without the need for if else.
    form = AnalysisSearchForm(request.GET or {})
    context['form'] = form

    if form.is_valid():            
        # The rest of your code here ... .