2016-08-08 26 views
0

Ich versuche, eine Suchleiste zu implementieren, um meine Datenbank abzufragen und nur die Übereinstimmungen anzuzeigen. Wenn ich "submit" drücke, gibt es mir einfach "SEARCH", was ich als Standard eingestellt habe, anstatt einen Fehler zu drucken.Django Search Bar Implementierung

ajax.py

... 
def chunkSearcher(request): 
test = request.GET.get('search_box', "SEARCH") 
print(test) 
.... 

Searcher.html

<form type="get" action="." style="margin: 0"> 
<input id="search_box" type="text" name="search_box" value="Search..." > 
<button id="search_submit" type="submit" >Submit</button> 

urls.py

url(r'^ajax/chunk/Searcher/$', 
    ajax.chunkSearcher, name='chunkSearcher') 

views.py (Es funktioniert tatsächlich hier aus irgendeinem Grund, aber es wird die gleichen zwei Zeilen Code in meinem Ajax Code

def searcher(request): 
# test = request.GET.get('search_box', "SEARCH") 
# print(test) 
this_main = Searcher(
    request   = request, 
    num_elements  = Candidate.objects.all().count(), 
    size    = 'col-xs-12', 
    title   = 'Search', 
    modelname  = 'Searcher', 
    listing_fields = [ 
     {'readable_name': 'Name', 'model_attribute': 'full_name()', 'subtext_model': 'email', 'color': 'False'}, 
     {'readable_name': 'Status', 'model_attribute': 'get_status_display()', 'color': 'True'}, 
     {'readable_name': 'Automated Status', 'model_attribute': 'get_auto_status()', 'color': 'True'}, 
     {'readable_name': 'Submitter', 'model_attribute': 'submitter', 'color': 'True'}, 
    ], 
    listing_actions = [ 
     {'tooltip': 'Search', 'color': 'success', 'icon': 'plus', 'permission': 'prog_port.add_candidate', 'modal': 'candidateform', 'controller': 'addCandidate'}, 
    ], 
) 

context = { 
    'nav' : Nav(request), 
    'main' : this_main, 
    'fb'  : TestFeedback() 
} 
return render(request, 'prog_port/base.html', context) 

widgets.py

class Searcher: 
def __init__(self, request, 
        num_elements, 
        size       = 'col-xs-12', 
        modelname     = None, 
        title      = None, 
        listing_fields    = None, 
        listing_actions    = None):#!! 

    self.template = 'prog_port/widgets/Searcher.html' 
    self.size = size 
    self.modelname = modelname 
    self.num_elements = num_elements 
    self.num_pages = int(math.ceil(num_elements/25.0)) 
    self.title = title 
    self.listing_fields = [x['readable_name'] for x in listing_fields] 
    self.listing_actions = listing_actions 

    for action in self.listing_actions: 
     action['restricted'] = False 
     if 'permission' in action: 
      if not request.user.has_perm(action['permission']): 
       action['restricted'] = True 
nicht erkennen
+0

Was passiert, wenn Sie das Attribut 'action' Ihres Formulars so ändern, dass es auf die URL Ihrer ajax-Ansicht zeigt? – souldeux

+0

@souldeux Wenn ich die Aktion in 'action ="/ajax/chunk/Searcher "' ändere, spuckt der Text, den ich in das Feld eingegeben habe, tatsächlich in mein Terminal, aber die Seite wird nicht geladen. ** Vor ** 'SUCHE [08/Aug/2016 13.18.54] "GET/Ajax/chunk/Searcher /? Page = 1 & orderby = 0% 3Basc HTTP/1.1" 200 4467' * * Nach ** '[08/Aug/2016 14:12:30]" GET/ajax/chunk/Sucher /? Page = 1 & orderby = 0% 3Basc HTTP/1.1 "200 4243 [08/Aug/2016 14: 12:37] "GET/ajax/chunk/Sucher? Search_box = Test + Suche HTTP/1.1" 301 0 Testsuche [08/Aug/2016 14:12:37] "GET/ajax/chunk/Searcher /? search_box = Test + Suche HTTP/1.1 "200 4240" –

Antwort

0

Ohne Ajax wäre es ein bisschen schneller zu starten. Wenn das Attribut action Ihres Formulars auf die URL der aktuellen Seite verweist (und nicht auf die URL Ihrer ajax-Ansicht), wird die GET-Anfrage an die Ansicht gesendet, die der URL dieser Seite entspricht - Ihre searcher Ansicht in Ihrem Fall. Aus diesem Grund konnten Sie die erwarteten Werte drucken, wenn Sie diese beiden Zeilen in dieser Ansicht hatten.

ist wichtig, da die searcher Ansicht die eine Rendering Ihrer Seite ist, in dieser Ansicht Zugriff auf Ihre search_box-Wert lässt Sie filtern oder auf andere Weise die queryset manipulieren wird in den Kontext der Ansicht geführt und letztlich nur Anzeige der eingeschränkten/gefilterten Elemente, die Sie will gezeigt werden.

Eine separate Ajax-Ansicht hat nicht sofort Zugriff auf all diese Sachen. Um Ihre Suchergebnisse dynamisch mit einer separaten Ajax-Ansicht zu aktualisieren, muss diese Ansicht auf Ihre Anfrage mit allen Informationen reagieren, die für das korrekte Rendern der Seite erforderlich sind. Praktisch gesprochen, dass eines von zwei Dingen in der Regel bedeutet:

  1. Ihre Suchergebnisse innerhalb eines div oder anderen definierten Content-Bereich angezeigt werden, und Ihre Ajax Ansicht gibt den HTML notwendig, dass Content-Bereich mit dem entsprechenden Material zu füllen, oder

  2. In der ersten Ansicht wird die Vorlage basierend auf serialisiertem JSON gerendert, und Ihre Ajax-Ansicht enthält aktualisierte Informationen in diesem Format, die dann zum erneuten Rendern der Vorlage verwendet werden.

This is a good starting point for getting the hang of ajax with django. Hinweis im Beispielcode gegeben, wie die Ansicht mit einigen data auf den Ajax-Aufruf reagiert (ein Httpresponse oder eine gerenderte Vorlage), und wie die data wird dann in der Erfolg/Misserfolg Funktionen verwendet.

Wenn Ihre AJAX-Ansicht den zum Rendern von Suchergebnissen erforderlichen HTML-Code zurückgibt, können Sie die Suchergebnisse div (oder Tabelle oder was auch immer) auf Ihrer Seite mit diesem neuen HTML aktualisieren.Zum Beispiel:

views.py

def index(request): 
    return render(request, "index.html") 

def ajax_update(request): 
    return HttpResponse("<h1>Updated Header</h1>") 

index.html

... 
<div id="update_this_header"> 
    <h1>Old header</h1> 
</div> 
<button id='updater'> 
... 
<script> 
$("#updater").click(function() { 
    $.ajax({ 
     url: #url to ajax_update view 
     success : function(data) { 
      $("#update_this_header").html(data) 
     }, 
     failure : function(data) { 
      ... 
     } 
    }); 
}); 
</script> 

nun die updater Schaltfläche klicken sollten den Inhalt des update_this_header div mit dem HTML-Update zurück in die Httpresponse unserer ajax_update (Ich gebe zu, ich habe das nicht getestet, vergib mir, wenn es einen Tippfehler gibt). Die Aktualisierung Ihrer Suchergebnisse funktioniert auf die gleiche Weise. Sie müssen nur mehr Verarbeitung in Ihrer Ajax-Ansicht durchführen, um mit dem korrekten HTML zu antworten.

Ich hoffe, dass dies die Dinge etwas klarer macht; Bitte lassen Sie es mich wissen, wenn ich etwas ausführlicher erklären kann (versuche). Der wichtige Takeaway hier ist, dass eine Ajax-Ansicht Sie mit einigen Daten versorgen wird. Es liegt an Ihnen, sicherzustellen, dass Ihre Vorlage diese Daten aufnehmen und ordnungsgemäß anzeigen kann.