对于我的一个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
上的一些字段名称吗?
答案 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})