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