2015-07-20 69 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