2010-02-16 71 views
6

嚴重性的概念存在於Django的表單驗證中,還是隻有錯誤?警告(甚至信息消息)而不是Django中的錯誤

另外,如何抑制警告/錯誤?

+0

現在的問題是四歲,仍然沒有好的解決方案發布。沒有解決?消息框架不起作用,因爲您希望看到輸入字段旁邊的警告。 – guettli 2014-08-13 07:50:30

回答

3

Django表單只能引發ValidationErrors(請參閱here)。解決這個問題的一種方法是使用new messaging system。定義了5個級別的消息,並具有定義其他自定義消息級別的功能。

至於抑制錯誤/警告,你總是可以忽略在你的模板form.errors。還要看看錶格模塊中的clean方法 - 您應該能夠抑制那裏的一些警告。

+0

django中的消息系統很好。但不幸的是,它不能在表單輸入旁邊顯示消息。例如:您有一張表格,您可以輸入您擁有的孩子數量。如果有人輸入「100」,您希望在輸入旁邊顯示警告,而不是在頁面的頂部。如果消息傳遞系統可以做到這一點,請糾正我。 – guettli 2014-08-13 07:47:54

+0

此外,通常在表單中沒有請求對象,並且根據表單的調用方式(即來自管理員),可能很難將其傳入。 – TAH 2015-12-09 04:04:37

7

老問題,但我認爲它仍然相關。

這真的取決於你認爲是一個警告。

  • 您可能會接受表單中的部分有效數據(不會在需要警告的字段上引發ValidationError)。然後,使用contrib.messages框架(或類似框架),您可以在下一頁上顯示警告框(可以是相同的表單頁面,也可以是重定向到主頁或任何其他頁面)
  • 或者,您可能需要確認的警告。您可以在創建時動態地添加或更改字段,那麼爲什麼不添加隱藏的「我接受風險」複選框,只有當您的表單引發該警告時才需要?

    1. 用戶加載表單。複選框是一個隱藏的HTML輸入設置爲false。
    2. 用戶使用引發警告的數據填充表單。窗體再次顯示,但現在該複選框可見。
    3. 用戶複選框然後重新提交他們的表單。
    4. 服務器正確處理數據並忽略警告。

第二個選項不要求餅乾的優勢,而且還增加了交互性(用戶可能不想繼續,因爲該警告的...)。

在代碼中,你必須做的是這樣的:

#views.py 
... 
if form.is_valid(): 
    # proceed 
else: 
    form.fields["my_checkbox"].widget = widgets.CheckboxInput 
    # re-display form 
... 


#forms.py 
... 
def clean_myfield(self): 
    # do your cleaning 
    if (myfield_warning==True) and not (my_checkbox==True): 
     raise ValidationError("blabla") 
    else: 
     return myfield 

在你看來,如果需要,您可以在form.errors查看相應的錯誤。

+1

偉大的答案!我會建議覆蓋'clean'方法而不是'clean_myfield'方法來評估複選框是否使用'cleaned_data'進行檢查。 – Nagasaki45 2014-05-20 11:13:33

+0

它也可以工作,但如果我記得,當您在'clean_ '中引發'ValidationError'時,您將獲得額外的好處,例如出現在字段中的錯誤消息而不是附加到表單。 – sleblanc 2015-07-01 18:43:09

+0

您仍然可以通過執行'self.add_error('my_field',message)在'clean'內的特定字段添加錯誤' – user857159 2017-08-15 14:51:36