2015-04-22 41 views
0

我有一個Django窗體,使用'forms.URLField'如local_url1 = URLField(label="First Local URL", required=False)。如果用戶輸入類似'https://www.google.com'的字段,則字段驗證無誤。Django窗體URLField允許空方案

但是,如果用戶放置「www.google.com」,則該字段未通過驗證,並且用戶看到錯誤。這是因爲URL的佈局爲scheme://host:port/absolute_path,失敗的URL缺少Django的URLFieldValidation期望的方案(例如https)。

我不在乎我的用戶是否包含該計劃,也不應該使用我的表單。不幸的是,django的錯誤在指出錯誤時完全沒有用,而且我有多個用戶詢問爲什麼它要輸入一個有效的URL。我也確信我因此失去了付費客戶。

有沒有辦法讓一個URL的所有其他驗證發生,但忽略該方案丟失的事實?至少,我是否可以更改錯誤消息以添加類似「您是否包含http?」。我試圖實現我自己的URLField和URLFieldValidation,但除非這是我必須採取的路徑,那麼這是一個不同的StackOverflow問題。順便說一下,我使用的是Django 1.7。謝謝你的幫助!

回答

1

URL/URI方案列表來驗證。如果未提供,則默認的 列表爲['http','https','ftp','ftps']。作爲參考,IANA網站 網站提供了valid URI schemes的完整列表。

如果IANA網站提供的有效URI方案不是您正在尋找的,那麼我建議您創建自己的字段驗證程序。

請記住,URLField是CharField的子類。並且由於www.something.com可以和你一起使用,那麼向正規CharField添加正則表達式很簡單,該正則表達式檢查模式是否正確。

像這樣的正則表達式,例如將驗證對wwwhttp://。所以有或沒有http或https。

((?:https?\:\/\/|www\.)(?:[-a-z0-9]+\.)*[-a-z0-9]+.*) 

www.google.com -- OK

http://www.google.com -- OK

https://www.google.com -- OK

http://google.com -- OK

https://google.com -- OK

然而,這不會併發症ain約blahwww.domain.com

所以你可能會加強它,只要你喜歡。

+0

謝謝@Othman。這與我嘗試過的路徑相似,但不完全一樣,所以我會給它一個鏡頭。這可能需要一些時間,但如果你的建議有效,我一定會回來並給你信貸。 – blh83

+0

只是想增加一個想法:我認爲最好是添加一些預驗證邏輯來​​添加默認方案。看起來比重新編寫一個沒有像Django URLField驗證器那樣經過良好測試的正則表達式更容易,也許更少出錯。 –