如何动态验证任意字段?

时间:2015-07-20 14:02:34

标签: django django-models django-forms

对于我的一个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和save之前,我想验证输入(即value)是否对于field引用的modelField有效,其中field是一个字符串。

有一种方法可以验证这一点,给定一些输入value和模型field上的一些字段名称吗?

2 个答案:

答案 0 :(得分: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 :(得分: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})