Python Django-Admin/Add running model.clean,即使缺少字段

Python Django-Admin/Add running model.clean,即使缺少字段,python,django,django-models,django-admin,django-validation,Python,Django,Django Models,Django Admin,Django Validation,好的,我有一个这样的模型: class Airplane(models.Model): tail = models.ForeignKey(Tails) wheel = models.CharField(max_length=500,blank=True) window = models.CharField(max_length=500,blank=True) def clean(self): if self.tail and self.wheel

好的,我有一个这样的模型:

class Airplane(models.Model):
    tail = models.ForeignKey(Tails)
    wheel = models.CharField(max_length=500,blank=True)
    window = models.CharField(max_length=500,blank=True)

    def clean(self):
        if self.tail and self.wheel and self.window:
            raise ValidationError("Can't have all three, choose tail and one more")
现在,如果我使用Django admin添加一个新的飞机记录。如果我将这两个字段保留为空并保存,则会出现Django错误,该错误指向self.tail和self.wheel

DoesNotExist at /admin/MyProject/airplane/add/

Request Method:     POST
Request URL:    http://44.101.44.172:8001/admin/MyProject/airplane/add/
Django Version:     1.2.5
Exception Type:     DoesNotExist
Exception Value:    

Exception Location:     /usr/lib/python2.7/site-packages/django/db/models/fields/related.py in __get__, line 299
Python Executable:  /usr/bin/python
Python Version:     2.7.0

Django是否应该在运行clean之前检查所需字段是否已填充?在任何情况下,处理此问题的最佳方法是什么?

您的tails字段不接受空值。您需要向其添加
null=True
,以使其正常工作。

好的,作为一种解决方法,我最终在admin.py中为此模型定义了一个with


我仍然不明白为什么在Django确定必填字段已填充之前调用model.clean。哦,好吧。

好吧,不,关键是我想让tail成为必需的。所以我不理解你的验证。如果需要尾部,并且尾部+车轮不是一个可能的选项,您如何拥有车轮?它总是错误的。这是一个强调问题行为的玩具示例,但更清楚地说,我更新了示例以使其更真实。更改示例代码后,您的代码可以正常工作。过来看。如果你不指定一个
尾巴
,它会大喊一个尾巴。如果指定全部三个,它将为所有三个发出呼喊。您可以(/应该)将if更改为
id self.wheel and self.window
,因为
self.tail
总是正确的。(尽管消息应该是“选择tail,最多“多一个”)