0

Say I have an Image model

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

I want the user to be able to upload an image file or submit an image url to link to. Is there a way for the model to require the user to have at least one of the two fields?

4

3 回答 3

1

在您看来,您可能会有类似的情况:

form = Image(request.POST or None)

当您从论坛获取数据时,您可能拥有form.cleaned_data['image']form.cleaned_data['url']. 如果一个是空的而另一个不是,继续你想做的任何事情。如果两者都为空,则继续显示错误。form.cleaned_data 只是一个包含表单值的字典,因此您可以检查哪些是空的。

于 2013-04-28T07:12:14.243 回答
0

一种方法是将它们都视为不需要,然后在您的视图中处理验证,在那里您可以检查是否存在任何一个,表单提交是否成功,您可以通过其他方式向用户输出错误。

这只是一个关于如何克服这个问题的想法,我知道它不会回答你的问题(虽然我认为这在模型中是不可能的,但我不确定)
希望它有所帮助

于 2013-04-28T06:45:55.163 回答
0

您有以下选择

  • clean()Image模型中添加方法。这将检查是否只提供了一个字段(图像或 URL)。否则提高ValidationError

    • 这将在您使用保存对象时处理条件ModelForm
  • 您还需要覆盖save()模型的方法。在此检查您是否只提供了一个字段,否则 raise 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()
于 2013-04-28T07:57:11.820 回答