2015-07-20 101 views
0

對於我的一個Django模型,我有一個由輸入字段組成的編輯模板。但是,與標準表單不同,只要這些輸入發生更改,我就會發出AJAX請求來保存該單個字段。我的AJAX端點基本如下所示:如何動態驗證任意字段?

def update_field(request, mod_id, field, value, element_id): 
    mod = Model.objects.get(id=mod_id) 
    setattr(mod, field, value) 
    mod.save() 
    return json.dumps({'element_id': element_id}) 

但是,這是一個非常基本且可能很幼稚的方法。在調用setattr和保存之前,我想驗證輸入(即value)對於任何型號字段field所指的有效,其中field是一個字符串。

有沒有一種方法來驗證這一點,給出一些輸入value和模型field一些字段名稱?

+3

HTTPS ://docs.djangoproject.com/en/1.8/ref/models/instances/#validating-objects – Anentropic

+0

我同意@Anentropic - 創建一個模型,並傳入正確的'instance'。 'clean_'方法會驗證該字段。 – karthikr

回答

0

有一個問題,使用任何的模型級的清潔方法,那就是將ValidationError募設置的模型,它是鍵控按字段名稱。就我而言,我只處理一個字段,而我只想處理來自該字段的ValidationErrors。爲了真正滿足我問這裏有什麼(即「有沒有一種方法來驗證一些給出了一些模型的一些字段名某些輸入值?」),我認爲這是合適的解決方案:

def update_field(request, mod_id, field, value, element_id): 
    mod = Model.objects.get(id=mod_id) 
    try: 
     modelfield = mod._meta.get_field(field) 
     setattr(mod, field, modelfield.clean(value, mod)) 
    except ValidationError as e: 
     # This can only be raised for errors on modelfield, not on any errors for `mod` 
     return json.dumps({'errormsg': str(e)}) 
    mod.save() 
    return json.dumps({'element_id': element_id}) 
1

您可以使用clean_fields()函數執行模型字段驗證。該方法驗證我們模型中的所有字段。

你可以這樣做:

from django.core.exceptions import ValidationError 
from django.db import models 

class MyModel(models.Model) 

    ... 

    def clean_fields(self): 
     if self.my_field_name != 'some_valid_value': # write your logic for validity here 
      raise ValidationError('Invalid value') # raise validation error 
     return super(MyModel, self).clean_fields() 
+1

非常酷,我忘了模型有他們自己的驗證器,並認爲我必須做一些瘋狂的事情,例如動態地定義和實例化一個新的ModelForm,用於我正在處理的任何領域或類似的東西。使用model.full_clean()/ model.clean_fields()會很好。謝謝! – Joseph