2015-11-08 57 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