2

Ich bin neu in Django, und ich habe vor kurzem ein System erstellt, wo Benutzer einen Datensatz basierend auf einer Nummer suchen können. Es ist nur eine einfache Suche. Die Systemnummern haben führende Nullen und ich möchte, dass das System die Zahlen mit oder ohne Nullen erkennt. Ich in der Lage gewesen, dieses System zu implementieren, und ich bin Umwandlung die Anzahl der Benutzer mit dem folgenden Code angibt:Stellen Sie sicher, dass die eingegebene Ganzzahl

def get_queryset(self): 
    queryset = super(SearchResultsView, self).get_queryset() 
    search_query = int(self.request.GET.get("q")) 
    if search_query: 
     queryset = Book.objects.filter(Q(request_number__icontains=search_query)).distinct() 

Der obige Code funktioniert gut, solange der Benutzer eine Nummer eingibt. Wenn sie einen Tippfehler enthalten und Buchstaben enthalten, bekomme ich ein ungültiges Literal für Base10. Ich verstehe den Fehler, ein Brief ist kein INT. Ich habe den größten Teil des Nachmittags damit verbracht, nach Möglichkeiten zu suchen, um diesen Fehler zu vermeiden, und ich kann nicht finden, wonach ich suche. Ich habe versucht, wie etwas zu tun:

if search_query: 
     try: 
      queryset = Book.objects.filter(Q(request_number__icontains=search_query)).distinct() 
     except ValueError: 
      q = 0000000 
    return queryset 

Aber die Buchstaben noch interpretiert werden und dann erhalte ich die ungültigen wörtlichen wieder für Base10 Fehler. Wie kann ich verhindern, dass die Buchstaben aufgrund einer Nummer ein Problem mit meiner Anfrage verursachen?

Ich habe auch herausgefunden, dass, wenn ich die Umwandlung in INT für die Suchanfrage entfernen, die Buchstaben nicht mehr ein Problem verursachen und das System gibt nichts zurück, als ich es erwarten würde, so habe ich eine Arbeit herum. Ich frage mich nur, wie ich das System dazu bringen könnte, beides zu tun, die Buchstaben zu akzeptieren und dann den ungültigen Literalfehler zu verhindern und dem System zu erlauben, die Eingabe in ganze Zahlen umzuwandeln. Vielen Dank im Voraus für Ihre hilfreichen Vorschläge.

Als Daniel Roseman vorgeschlagen habe ich versucht, das folgende Formular zu verwenden, aber es scheint nicht, den Fehler zu fangen ...

Klasse RequestNumberSearch (forms.Form):

q = forms.IntegerField(required=True) 

def __init__(self, user, *args, **kwargs): 
    super(RequestNumberSearch, self).__init__(*args, **kwargs) 
    self.fields['q'].widget.attrs['class'] = 'name2' 

def clean_q(self): 
    data = self.cleaned_data['q'] 
    if q != int: 
     raise forms.ValidationError("Please enter valid numbers!") 

    return data 
+1

Dies ist genau, was Formen sind. –

+0

@Daniel Roseman..Ja habe ich versucht, ein Formular auch für diesen Zweck zu nutzen ... Ich habe das Formular hinzugefügt und es scheint immer noch nicht zu funktionieren .... –

+0

Aber wenn Sie möchten, dass es validiert, dass der Wert ist eine ganze Zahl, warum verwenden Sie kein IntegerField und kein CharField? –

Antwort

1

Sie versuchen, die Abfrage vor dem Überprüfen in int zu konvertieren.

search_query = self.request.GET.get("q") 

if search_query.isdigit(): # check is digit 
    queryset = Book.objects.filter(Q(request_number__icontains=search_query)).distinct() 
    return queryset 
elif ... : # another check 
... 
else: 
    return 'query is erroneous' 
Verwandte Themen