2012-04-10 10 views
7

Situation: Ich habe ein Formular, das für die Suche verwendet wird, und ich gebe dasselbe Formular auf der Ergebnisseite zurück, damit der Benutzer seine Ergebnisse filtern kann. Um den Müll-Input loszuwerden, habe ich eine clean_xxx-Methode implementiert.Django Best Practices: Wie man ein Formular bereinigt und rendert

Leider wird das Formular auf der Ergebnisseite mit der Mülleingabe zurückgegeben, obwohl es gereinigt wurde. Wie kann ich die sauberen Daten anzeigen lassen?

Hier sind ein paar Ideen:

  1. Im clean_xxx Methode, stellen Sie den self.data.xxx = cleaned_xxx Wert
  2. Reinitialize eine neue Form mit dem cleaned_data.

forms.py:

SearchForm: 
    def clean_q(self): 
    q = self.cleaned_data.get('q').strip() 
    # Remove Garbage Input 
    sanitized_keywords = re.split('[^a-zA-Z0-9_ ]', q) 
    q = "".join(sanitized_keywords).strip() 

    #TODO: Fix 
    self.data['q'] = q 

    return q 

views.py

search_form = SearchForm(params, user=request.user) 
    if search_form.is_valid(): 
     # Build the Query from the form 
     # Retrieve The Results 

    else: 
     # For errors, no results will be displayed 
     _log.error('Search: Form is not valid. Error = %s' %search_form.errors) 

    response = { 
       'search_form': search_form... 
    } 

Vielen Dank für Ihre Hilfe.

+6

Zeigen Sie Ihren Code: http://sscce.org/ – Marcin

+0

Die Reinitialisierung sieht gut genug aus. Die erste Option ist ein Hack von einem gewissen Punkt. – ilvar

+0

@Marcin Ich habe meinen Code für Sie vereinfacht zu überprüfen – Naqeeb

Antwort

1

Was immer Sie von einer clean_xxx-Methode zurückgeben, wird angezeigt. So zum Beispiel:

forms.py:

class SearchForm(forms.Form): 
    def clean_q(self): 
     return "spam and eggs" 

Im obigen Beispiel wird sagen, das Feld "Spam und Eier".

Wenn dies nicht der Fall ist, liegt die Schwierigkeit in der Validierungslogik Ihrer Methode.

+0

Die clean_q-Funktion funktioniert gut, aber das Problem ist, dass ich das gleiche search_form zurückgeben, sobald es validiert wurde und das q ist das gleiche. Zum Beispiel: q = Stackoverflow()()() clean_q = Stackoverflow Das Formular zeigt q als Stackoverflow()()(). Gibt es eine bessere Möglichkeit, die cleaned_data q auf der Seite anzuzeigen? – Naqeeb