Django模型:要求用户输入任一字段,但不能同时输入两者或两者都不输入?

时间:2013-04-28 06:35:40

标签: python django django-models

说我有一个图像模型

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

我希望用户能够上传图片文件或提交图片网址进行链接。有没有办法让模型要求用户至少拥有两个字段中的一个?

3 个答案:

答案 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()