2017-04-11 1 views
0

Der Versuch, eine Django-Anwendung zu erstellen, aber einen UnboundLocalError at /search/ local variable 'results' referenced before assignment Fehler zu erhalten. Ich kann das Problem nicht sehen, wie in meinem Code Ergebnisse zugeordnet ist - werfen Sie einen Blick auf:Verrückter Django-Fehler - Variable, auf die vor der Zuweisung verwiesen wird

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

ist es nicht offensichtlich, dass 'result' nicht definiert ist, wenn' form.is_valid() == False'? –

+0

Ich bin wirklich neu in Django - nur nach einem Tutorial –

+0

Was soll ich tun, um es zu beheben –

Antwort

2

Vielleicht sollten Sie Ergebnisse initialisieren. Put results = [] vor if form.is_valid()

0

Wenn Sie die Definition in einer rekursiven Weise verwenden wollen (die Ergebnisse in Ihrem Fall zählen) sollten Sie die var Ergebnisse außerhalb der Definition zuweisen, denn wenn Sie tun es jedes Mal, wenn Sie es zurücksetzen rufen . Sie müssen es aus der Definition zuweisen und es wie eine globale Variable angeben.

global results 
results = '' 

Ich persönlich empfehle Ihnen, ein wenig mehr lesen und lernen auf Python vor dem Kodieren mit Django.

Viel Glück! :)

+0

Es gibt fast nie einen Grund, globale Variablen in Python zu deklarieren.Eine einfache Ergebnisvariable kann in diesem Fall einfach im Rahmen dieser Funktion gehandhabt werden. –

+0

Können Sie bitte etwas genauer sein? Wenn er eine Iteration mit der Funktion durchführen möchte, wird das var-Ergebnis bei jedem Aufruf der Funktion zurückgesetzt, und wenn das var-Ergebnis als global deklariert ist, kann es in anderen Funktionen und dem Wert der var-Funktion für die erste Funktion verwendet werden wird in den kommenden nicht geändert. Deshalb habe ich vorgeschlagen, die var-Ergebnisse als global zu deklarieren. – user7519508

+0

"Wenn er Iteration mit der Funktion" Was meinst du damit? –

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

jetzt müssen Sie Bestätigungscode in Vorlage schreiben

2

Es hängt davon ab, was Sie wollen tun, wenn es keine Treffer. Möchten Sie die Ansicht immer noch laden? Dann initialisiert die results Variable über jeden if Zustand (in diesem Fall die äußere):

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

Wenn Sie laden möchten, um die Ansicht nicht, ob es gibt keine Treffer, könnten Sie die return render(...) innerhalb der inneren bewegen if Wenn Sie sicher sind, gibt es eine results Variable zu Beginn mit. Dann können Sie einen Fallback return render(...) am Ende der Funktion hinzufügen, außerhalb von if Bedingungen.

Wenn Sie immer die gleiche Ansicht laden möchten, würde ich jedoch für die erste gehen. Das Hinzufügen von mehreren return render(...) scheint besser geeignet, wenn Sie eine andere Ansicht laden möchten, wenn keine Ergebnisse gefunden wurden.

2

Was ist, wenn form ungültig ist? Zum Beispiel hat der Benutzer einen falschen Wert auf keinen Wert angegeben? In diesem Fall ist results nicht initialisiert. Sie können:

  1. Initialisieren Sie es mit einigen leeren Wert wie [].

  2. Fehler erhöhen und zu Benutzerinformationen zurückkehren, dass das Formular ungültig ist.

Verwandte Themen