2010-10-24 44 views
2

如何清理表單中的數據並重新顯示清除的數據而不是提交的數據?如何強制清理一個字段並在Django中重新顯示它?

我的表單中有幾個字段,每次用戶提交時,都應該重新顯示用戶輸入的值。但是,我希望爲用戶清理和更新一些字段。更具體地說,我有一個字段FriendlyIntegerField(forms.CharField),其中我重寫to_python不僅可以調用int(str(value)),還可以將任何負數設置爲0等。我不想重新顯示帶有無效數據的表單,並讓用戶自己修復它(其中Django是如何讓我這樣做的)。

我沒有問題清理數據並將其用於我的視圖函數的其餘部分,但是如何使用此數據更新實際的表單?

順便說一下,表單並不反映我的數據模型中的結構,因此它繼承自Form而不是ModelForm

編輯:

我的領域(在一個精簡版)看起來是這樣的:

 
class FriendlyIntegerField(forms.CharField): 
    def to_python(self, value): 
     try: 
      return str(int(str(value).replace(' ',''))) 
     except: 
      raise forms.ValidationError('some error msg') 

我的表格(在精簡版)看起來是這樣的:

 
class SearchForm(forms.Form): 
    price_from = FriendlyIntegerField() 
    price_to = FriendlyIntegerField() 

我的看法:

 
def search(request, key): 
    if request.method == 'POST': 
     form = SearchForm(request.REQUEST) 
     if not form.is_valid(): 
      print "Form not valid" 
    else: 
     form = SearchForm() 
    return render_to_response('path_to_template', {'form' : form} 

+2

作爲一個便箋,你應該注意這一點。我不記得我在哪裏讀過它,但顯然改變用戶輸入的值可能會讓最終用戶感到困惑。簡單地告訴他們負面的價值觀是不被允許的,重新顯示他們(錯誤的)輸入可能比你想象的更加用戶友好。 – LaundroMat 2010-10-25 18:56:57

+0

我絕對同意LaundroMat。默默地改變用戶輸入通常不是一個好主意。負數可能不是最好的例子,我可能會在最終版本中跳過。不過我想刪除數字中的空格。該字段代表價格,我認爲自動將「250 000」更改爲「250000」是個好主意。 – knatten 2010-10-26 06:07:03

回答

0

如果在用is_valid()清理表單後,您使用視圖呈現了清理過的表單,而不是重定向到新頁面,則會在頁面中看到已清除的數據。

(如果您希望用戶看到這個清理過的數據,然後正確提交它,您可以使用隱藏字段來跟蹤表單數據是否已被清除,但這並非沒有併發症......)

+0

您確定已清理的數據應該在表單重新顯示時呈現,而不是原始數據?我在上面發佈了一個精簡版的代碼,並且非常感謝您是否可以查看並檢查是否可以看到清理的數據未呈現的原因。作爲一個例子,如果我輸入一個帶有空格的數字,比如「42 43」,我希望它根據你在這裏說的內容呈現爲「4243」,但它仍然呈現爲「42 43」 – knatten 2010-10-26 06:03:33

+0

Fix它在clean_foo(self)方法中,並記得在它的結尾處返回清理後的值。如果你想清理數據(並顯示清理的效果),那麼對於to_python來說並不合適。 – 2010-10-26 06:15:36

+0

好吧,我改爲使用常規的CharField,並在SearchForm.clean_price_from()中進行清理,它會返回清理後的值。我的觀點與上述相同,只是我在'else'前面記錄了form.cleaned_data ['price_from']。記錄的數據被清理,重新顯示的表格不是。 – knatten 2010-10-26 18:07:16

相關問題