说我有一个图像模型
class Image(...
# store file info
image = ImageField(...
# store link info
url = URLField(...
# storing either image or url is okay
# storing both is NOT okay
# storing neither is NOT okay
我希望用户能够上传图片文件或提交图片网址进行链接。有没有办法让模型要求用户至少拥有两个字段中的一个?
答案 0 :(得分:1)
在视图中,您可能会遇到以下情况:
form = Image(request.POST or None)
当您从论坛获取数据时,您可能会form.cleaned_data['image']
和form.cleaned_data['url']
。如果一个是空的而另一个不是,那就继续你想做的事。如果两者都为空,则继续显示错误。 form.cleaned_data只是一个包含表单值的字典,因此您可以检查哪些是空的。
答案 1 :(得分:0)
执行此操作的一种方法是将它们都视为不需要,然后在视图中处理验证,在那里您可以检查是否存在任何一个,表单提交是否成功,其他您可以向用户输出错误的方法。
这只是一个如何克服这个问题的想法,我知道它不会回答你的问题(尽管我认为这在模型中是不可能的,但我不确定)
希望它有所帮助
答案 2 :(得分:0)
您有以下选项
在Image
模型中添加clean()
方法。这将检查是否只提供了一个字段(图像或URL)。否则提出ValidationError
。
ModelForm
保存对象时的条件。您还需要覆盖模型的save()
方法。在此检查中,您是否只提供了一个字段,否则请引发IntegrityError
。
类似的东西:
obj = Image.objects.get(id=<some_id>)
obj.url = some_url
obj.save()
full_clean
方法。 喜欢
obj = Image.objects.get(id=<some_id>)
obj.url = some_url
obj.full_clean()
obj.save()