我正在使用模型表單讓用戶將數據放入數據庫。該表格排除用戶字段,因此用戶不能自行更改。如何自動更改Django中IntegrityError的db輸入?
class Meta:
model = Server
exclude = ["user","name", "quirky"]
而是在我調用.save(commit = False)後,用戶字段的值將被放入。
if neuer_server_form.has_changed() and neuer_server_form.is_valid():
neuer_server = neuer_server_form.save(commit=False)
neuer_server.user = request.user
neuer_server.name = slugify(neuer_server.name)
neuer_server.save()
因此,用戶字段被排除在驗證之外。現在用戶字段和另一個字段之間有unique_together。
class Meta:
unique_together = ('user', 'name',)
因爲用戶字段被排除在外,所以不會有對unique_together的驗證。因此,在保存實例時可能存在IntegrityError錯誤。
如果我堅持: 所以我的第一個想法是檢查分貝如果CharField已經存在,如果是的話只是加入了一些改變,並再次檢查。但是如果我這樣做,攻擊者可能會插入很多類似的字符串,所以我的服務器必須無限期地檢查這些字符串。
可能的解決方案: 所以對我來說,將有兩個可接受的解決辦法:要麼CharFields值更改的東西,絕對不不首先嚐試了很多還不存在。或者使驗證失敗並將表單返回給用戶。
我的嘗試: 我認爲第二個是理想的,但因爲我使用的模型表單集,不能要求用戶傳遞給它不可能形式爲我做的是: Django's ModelForm unique_together validation
相反,我想知道是否有可能在通過formset循環時將自制錯誤添加到表單。
有點像這樣的僞代碼:
for form in formset.forms:
if form.is_valid():
server_name = form.cleaned_data.get("name","")
if Server.objects.get(user=request.user,name=server_name).count():
formset.forms[form].errors += "here is my own error message"
formset.forms[form].fields["name"].errors += "this field is wrong"
任何想法如何解決呢?感謝您的幫助,如果你讀到這裏:)
謝謝你的回答。這隻會通過消息系統給出信息,但不能使用表單錯誤功能(例如指出哪個字段錯誤)? – JasonTS 2014-10-02 06:51:57
該消息的輸出是特定錯誤(無字段名稱)。如果你想顯示哪個字段有錯誤,你可以修改它。正如你所看到的,那裏有k&v。爲什麼不測試它讓你看到。 – catherine 2014-10-02 07:33:35