2015-11-08 93 views
0

我的“查看”代码在代码中有明显的重复。有什么方法可以重构“返回”代码?重构“查看”代码

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

我非常建议你考虑基于类的视图。 – Wtower

回答

2

有没有必要的首先是其他所有。将最终的渲染移回缩进,并且会捕获其他情况。请注意,这是文档中明确描述的模式。另外,使用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}, 
    ) 
+0

当表单无效时,Django不停地产生错误HttpResponse对象是none。因此,为了规避这个错误,我把第一个“其他”包括在内。根据你的建议,无效表单将不会被重定向。有没有办法解决这个问题? – Cloud

+1

不,只要你精确地遵循这种模式,就不会发生这种情况:正如我所提到的,最后的“return”行不能缩进。 –

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_responserender它做同样的事情 - 你只需要输入少...尝试偷懒;)

我想,这有效。没有经过测试。如果请求没有在POST中完成,那么is_valid()返回False,将form返回为None,这是有道理的。并在POST请求和无效值的情况下,然后else踢和返回错误消息的形式...我认为,这个工程..请测试

+0

Re:'你忘了reverse()' - 当你使用'redirect'快捷方式时,你不需要先调用'reverse',它会为你反转URL! – Alasdair

+0

@Alasdair你的意思是'redirect('index_view')'会做同样的事情吗? – doniyor

+0

@Alasdair你是对的:https://github.com/django/django/blob/master/django/shortcuts.py#L42-L49感谢您的诀窍 – doniyor