重构“视图”代码

时间:2015-11-08 09:25:23

标签: django python-3.x django-views

我的“视图”代码在其代码中有明显的重复。有没有办法重构“返回”代码?

def form_contractor_view(request):
    if request.method == 'POST':
        form = ContractorForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('index_view')
        else:
            return render_to_response(
                'form_contractor.html',
                {'form': form},
                context_instance=RequestContext(request),
            )
    else:
        form = ContractorForm()
        return render_to_response(
           'form_contractor.html',
           {'form': form},
           context_instance=RequestContext(request),
        )

2 个答案:

答案 0 :(得分:2)

根本不需要第一个其他人。将最终渲染移回缩进,这将捕获else的情况。请注意,这是文档中明确描述的模式。

另外,请使用render代替render_to_response

def form_contractor_view(request):
    if request.method == 'POST':
        form = ContractorForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('index_view')
    else:
        form = ContractorForm()
    return render(
       request,
       'form_contractor.html',
       {'form': form},
    )

答案 1 :(得分:0)

我会尝试:

def form_contractor_view(request):
    form = ContractorForm(request.POST or None)
    if form.is_valid():
        form.save()
        return redirect(reverse('index_view')) # <-- you forgot reverse() here
    return render(
        request,
        'form_contractor.html',
        {'form': form}
    )

我将render_to_response替换为render,它执行相同的操作 - 您只需键入较少...尝试懒惰;)

我认为,这很有效。虽然没经过测试如果请求未在POST中完成,则is_valid()会返回False,将form再次作为None返回,这是有道理的。对于请求在POST中完成并且其中包含无效值的情况,然后else启动并返回带有错误消息的表单...我认为,这可行..请测试