rol*_*one 7 django django-models django-forms
试着立即解决一个有趣的问题.
我有一个Django模型,其image字段不是必需的,但在创建新模型实例时设置为默认值.
class Product(models.Model):
image = models.ImageField(upload_to='/image/directory/', default='/default/image/path/', blank=True)
Run Code Online (Sandbox Code Playgroud)
我还有一个基于该模型的ModelForm,包括该image字段,并且有一些自定义验证.
class ProductForm(forms.ModelForm):
class Meta:
model = Product
fields = ('image',)
def clean_image(self):
image = self.cleaned_data.get('image', False)
if image:
# validate image
return None
Run Code Online (Sandbox Code Playgroud)
问题是,每个的文档,要求is_valid()对ModelForm除触发模型验证,形成验证,所以当用户提交雏型没有图像,我的自定义表单验证代码试图验证默认的模型图像,而不是仅仅无所事事因为它应该.
除非表单本身具有该image字段的值,否则如何使其不执行任何操作?
rol*_*one 13
刚刚以非常简单的方式解决了它.在这里添加答案,以防它对其他人有帮助.
...绑定到模型对象的模型表单实例将包含一个
self.instance属性,该属性为模型表单方法提供对该特定模型实例的访问.
因此ModelForm,我只是检查图像值是否已从保存的实例中更改,而不是检查是否具有图像值.表单验证现在看起来像这样:
class ProductForm(forms.ModelForm):
class Meta:
model = Product
fields = ('image',)
def clean_image(self):
image = self.cleaned_data.get('image', False)
if not self.instance.image == image:
# validate image
return None
Run Code Online (Sandbox Code Playgroud)
问题解决了!