2014-10-02 38 views
0

我正在使用模型表單讓用戶將數據放入數據庫。該表格排除用戶字段,因此用戶不能自行更改。如何自動更改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" 

任何想法如何解決呢?感謝您的幫助,如果你讀到這裏:)

回答

0
if request.method == 'POST': 
    server = Server(user=request.user) 
    form = ServerForm(request.POST, instance=server) 
    if form.is_valid(): 
     f = form.save() 
     f.name = slugify(f.name) 
     f.save() 
    else: 
     messages.error(request, 
      ' '.join([v[0].__str__() for k, v in form.errors.items()])) 
+0

謝謝你的回答。這隻會通過消息系統給出信息,但不能使用表單錯誤功能(例如指出哪個字段錯誤)? – JasonTS 2014-10-02 06:51:57

+0

該消息的輸出是特定錯誤(無字段名稱)。如果你想顯示哪個字段有錯誤,你可以修改它。正如你所看到的,那裏有k&v。爲什麼不測試它讓你看到。 – catherine 2014-10-02 07:33:35