【问题标题】:Refactoring the "view" code重构“视图”代码
【发布时间】:2015-11-08 09:25:22
【问题描述】:

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

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),
        )

【问题讨论】:

  • 我强烈建议您考虑基于类的视图。

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


【解决方案1】:

根本不需要第一个else。将最终渲染移回缩进,这将捕获 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},
    )

【讨论】:

  • 当表单无效时,Django 不断产生错误,说 HttpResponse 对象是无的。因此,为了规避这个错误,我包括了第一个“else”。根据您的建议,无效的表格将不会被重定向。有什么办法吗?
  • 不,只要你完全遵循这个模式就不会发生这种情况:正如我所提到的,最后的return 行不能缩进。
【解决方案2】:

我会努力的:

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 替换了render_to_response,它做同样的事情——你只需少打字……尽量偷懒;)

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

【讨论】:

  • Re: 'you forgot reverse()' - 使用redirect 快捷方式时无需先调用reverse,它会为您反转URL!
  • @Alasdair 你的意思是redirect('index_view') 会做同样的事情吗?
  • @Alasdair 你是对的:github.com/django/django/blob/master/django/… 谢谢你的技巧
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
  • 1970-01-01
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
相关资源
最近更新 更多