還請大家多多交流指正
關於django新增一條記錄並對資料驗證的方式,官方文件上是說資料驗證分為三步分別為
model.clean_fields()
model.clean()
model.validate_unique()
其中,model.clean_fields()
驗證字段比如長度格式等;
model.clean()
為自定義驗證條件和報錯資訊;
model.validate_unique()
為驗證新增的唯一性約束。
此三步驗證可呼叫full_clean()
來執行。
使用modelform
對資料進行驗證時可以使用is_valid()
方法,此方法包含了以上的三步驗證,但是使用s**e()
方法時將不會自動驗證。
所以,新增或修改記錄使用s**e()
方法前需要呼叫full_clean()
方法。
另外,新增記錄時如果使用create()
似乎不會進行自定義的校驗。個人嘗試過在字段定義時未定義唯一約束,在自定義驗證中判斷是否唯一時未報錯,驗證方法如下,如有不當還請指正:
# 判斷ip位址和裝置名稱是否唯一
defclean
(self)
:if self.ip_addr:
if info.objects.
filter
(ip_addr__exact=self.ip_addr, status=
true):
raise validationerror(_(u'%s 此ip已被占用'
% self.ip_addr)
)if info.objects.
filter
(equit_name__exact=self.equit_name, status=
true):
raise validationerror(_(u'%s 此裝置已存在'
% self.equit_name)
)
這樣寫新增記錄的時候沒問題,但是更新的時候使用form
時如果用form.is_valid()
方法校驗會發生唯一性衝突,所以個人的解決方法時先判斷ip和裝置名稱是否有變化,如果兩個都有變化則使用form.is_valid()
如果只有乙個有變化就自行判斷
因為需求上需要通過ip位址和狀態判斷唯一性,如果裝置停用的狀態下ip可以重新使用,裝置名同樣。如果有無ip的裝置,如光纖收發器等,此時通過裝置名進行判斷是否唯一。
在model中做此類校驗會導致view中更新記錄的時候報唯一性錯誤,因此把校驗是否存在在用的同一ip或同一裝置名稱判斷放在view中進行,校驗的流程如下:
裝置名稱在model中為必填字段,故用form.is_valid()
或full_clean()
進行驗證。修改記錄部分校驗**:
# 錯誤資訊預設為空
error_msg =
''form = equitform(request.post)
if form.is_valid():
# 判斷是否有對ip進行修改
if equit.ip_addr != request.post.get(
'ip_addr',''
):if request.post.get(
'ip_addr',''
):if equit.objects.
filter
(ip_addr__exact=request.post.get(
'ip_addr',''
), status=
true
)and equit.status:
error_msg = u'ip位址已存在'
if equit.equit_name != request.post.get(
'equit_name',''
):if equit.objects.
filter
(equit_name__exact=request.post.get(
'equit_name',''
), status=
true
)and equit.status:
error_msg = u'該裝置已存在'
if error_msg:..
.# 渲染介面,報錯
else:.
..# 修改記錄
else:.
..# 渲染介面,報錯
Django頁面路由和資料返回
建立django專案命令 1.在檢視函式中建立hello word函式.匯入模組 from django.http import httpresponsegone 2.路由配置 應用路由配置 在blog資料夾下建立url.py 匯入模組 from django.urls import path,in...
django 多對多資料新增
class userinfo models.model 使用者表 既有班主任也有老師 username models.charfield max length 32 password models.charfield max length 64 email models.charfield max ...
django框架中,新增使用者操作記錄和查詢功能
django的核心在於中介軟體middleware,django所有的請求 返回都由中介軟體來完成。中介軟體,就是處理http的request和response的,類似外掛程式,比如有request中介軟體 view中介軟體 response中介軟體 exception中介軟體等,middlewar...