0

Django Neuling hier. Ich habe vor kurzem eine einfache Suche mit Django implementiert. I Benutzer gibt Daten in der Suchleiste an, die Suche wird ausgeführt. Ich konnte heute feststellen, wie die Suche auf null gesetzt wird, wenn der Benutzer auf eine leere Suchleiste klickt. Was ich wirklich erreichen möchte, ist eine Fehlerlogik zu implementieren, so dass der Benutzer Daten in der Suchleiste angeben muss. Das war sehr einfach mit all den anderen Ansichten, aber die Suche ist ein bisschen schwieriger, für mich sowieso. Ich habe heute mehrere SO-Suchen durchgeführt und festgestellt, dass meine HTML-Get-Methode für eine Suche in Ordnung ist, aber möglicherweise Probleme mit der von mir verwendeten FORMVIEW verursacht. Ich habe auch versucht, POST und GET für die FORMVIEW zu überschreiben, aber es scheint nicht zu funktionieren. Ich möchte bei CLASS BASED VIEWS bleiben, daher verwende ich FORMVIEW. Hier ist mein Code ....Django Formview wird nicht validiert

Mein HTML

<form method="GET" autocomplete=off action="{% url 'Book:book_request_search_results' %}" > 

<div> 
    <h1 class="title">Book Request Search</h1> 
</div> 

{{ form.non_field.errors }} 
    <div class="section"> 
    <input type="search" class="name2" name="q"> 
    </div> 

    <div class="section"> 
    <input type="submit" id="" class="submit6" value="Search"> 
    </div> 

Mein VIEWS.PY

class BookRequestSearchView(LoginRequiredMixin,FormView): 
    form_class = BookRequestSearch 
    template_name = 'store/Book_request_search.html' 
    success_url = reverse_lazy('store:book_request_search_results') 

def form_valid(self, form): 
    self.kwargs['q'] = form.cleaned_data['q'] 
    if self.request.GET.get('q'): 
     pass 
    else: 
     raise forms.ValidationError("Enter data") 
     return super(BookRequestSearchView, self).form_valid(form) 

Mein FORMS.PY

class BookRequestSearch(forms.Form): 

q = forms.CharField(required=True) 

def __init__(self, *args, **kwargs): 
    super(BookRequestSearch, self).__init__(*args, **kwargs) 

ich auch eine saubere hinzuzufügen versucht Methode zu meinem Formular, aber das scheint auch nicht zu funktionieren ...

def clean(self): 
    search = self.initial['q'] 
    if search: 
     pass 
    else: 
     raise forms.ValidationError("Enter data") 
    return self.cleaned_data 

Ich habe die meiste Zeit des Nachmittags gescannt und finde keine Möglichkeit, eine Validierung der FORMVIEW auszulösen, um einen Fehler in der Suchleiste auszulösen. Jede Hilfe wäre willkommen. Ich habe viele verschiedene FORMVIEW Artikel gesehen, aber keiner von ihnen hat mir geholfen zu verstehen, was ich falsch mache und warum das nicht funktioniert. Die Art, wie der Code jetzt ist, funktioniert, aber er hindert den Benutzer nicht daran, auf die Suche zu klicken und dann im Wesentlichen eine leere Abfrage auszulösen. Ich versuche das zu verhindern, indem ich den Benutzer zwinge, etwas in die Box zu legen, wenn sie versuchen, ohne Kriterien zu suchen. Vielen Dank im Voraus für jede Richtung.

+0

Haben Sie darüber nachgedacht, JavaScript zu verwenden? Auf diese Weise machen Sie keine Anfrage. Die Formularvalidierung wird * nach * der Anfrage durchgeführt. –

+0

@guillermochamorro Nein, ich habe es noch nicht berücksichtigt. Scheint so, als ob es über Django möglich wäre, nur zu versuchen zu verstehen, was ich falsch mache. –

+0

Sie können nicht von der Serverseite (Django) erzwingen, weil die Anfrage erledigt wurde. Ich verstehe, dass Sie von der Client-Seite vermeiden möchten, eine leere Anfrage zu senden. Das ist nur mit Javascript möglich. –

Antwort

0

Ich habe falsch gesagt, dass es nur mit Javascript möglich ist.

Es ist so einfach wie das Attribut required zu Ihrem Eingabeformular hinzufügen, so dass der Browser den leeren Fehler abfängt.

<form> 
    <input type="search" required><!-- added the required attribute--> 
</form>