2017-04-11 21 views
0

試圖創建一個Django應用程序,但得到一個UnboundLocalError at /search/ local variable 'results' referenced before assignment錯誤。我看不到的問題,因爲在我的代碼結果分配 - 看看:瘋狂的Django錯誤 - 分配前引用的變量

def post_search(request): 
    form = SearchForm() 
    if 'query' in request.GET: 
     form = SearchForm(request.GET) 
     if form.is_valid(): 
      cd = form.cleaned_data 
      results = SearchQuerySet().models(Post).filter(content=cd['query']).load_all() 
      # count total results 
      total_results = results.count() 
    return render(request, 'blog/post/search.html', {'form': form, 
               'cd': cd, 
               'results': results, 
               'total_results': total_results}) 
+2

在'form.is_valid()== False'的情況下,'result'沒有被定義是不是很明顯? –

+0

我對Django非常陌生 - 僅僅遵循教程 –

+0

我應該怎麼做才能解決它 –

回答

2

也許你應該初始化結果。 以前if form.is_valid()

0

results = []如果你想使用遞歸的方式定義(算在你的情況下的結果),你應該分配的定義之外的VAR的結果,因爲如果你這樣做會在每次調用時重置。你必須將它從定義中分配出來,並像全局變量那樣聲明它。

global results 
results = '' 

我個人建議你在使用Django編碼之前多做一些閱讀和學習python。

祝你好運! :)

+0

幾乎沒有理由在python中聲明全局變量。在這種情況下,一個簡單的結果變量很容易在該函數的範圍內處理。 –

+0

你可以請更具體一點嗎?如果他想對函數進行迭代,則每次調用函數時都會重置var結果,如果將var結果聲明爲全局函數,則可以將其用於其他函數以及var在第一個函數中獲取的值在未來的人中沒有改變。這就是爲什麼我建議將變量結果聲明爲全局的原因。 – user7519508

+0

「如果他想用函數」你是什麼意思? –

1
def post_search(request): 
    cd = "" 
    total_results = "" 
    form = SearchForm() 
    if 'query' in request.GET: 
     form = SearchForm(request.GET) 
     if form.is_valid(): 
      cd = form.cleaned_data 
      results = SearchQuerySet().models(Post).filter(content=cd['query']).load_all() 
      # count total results 
      total_results = results.count() 
    return render(request, 'blog/post/search.html', {'form': form, 
               'cd': cd, 
               'results': results, 
               'total_results': total_results}) 

現在你必須編寫驗證代碼模板

2

這取決於你想如果沒有結果的事。你還想加載視圖嗎?然後初始化上述任何if條件results變量(在這種情況下,外一種):

... 
results = [] #Or whatever empty datatype you need 
if 'query' in request.GET: 
    ... 

如果你不想如果沒有結果加載視圖,你可以移動return render(...)內內if當你當然有一個results變量開始。然後,您可以在該函數的末尾添加一個回退return render(...),但不包含任何if條件。

但是,如果您總是想要加載相同的視圖,那麼我只是爲了第一個視圖。添加多個return render(...)似乎更適合於在未找到結果時加載其他視圖。

2

如果form無效,該怎麼辦?例如,用戶在沒有任何值的情況下提供了不正確的值?在這種情況下,results未初始化。您可能會:

  1. 使用一些空值初始化它,如[]

  2. 引發錯誤並返回到用戶信息表單無效。