【问题标题】:Django - Admin/Add running model.clean even though fields are missingDjango - 即使缺少字段,也可以管理/添加正在运行的 model.clean
【发布时间】:2011-06-27 19:26:56
【问题描述】:

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

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 添加新的 Airplane 记录。如果我将这两个字段都留空并保存,我会收到指向行 if self.tail and self.wheel 的 Django 错误。

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 之前检查是否填写了必填字段吗?无论如何,处理这个问题的最佳方法是什么?

【问题讨论】:

    标签: python django django-models django-admin django-validation


    【解决方案1】:

    您的 tails 字段不接受空值。您需要将null=True 添加到它以使其工作。

    【讨论】:

    • 嗯,不,重点是我想要尾巴。
    • 所以我不明白你的验证。如果需要tail并且tail+wheel不是一个可能的选项,你怎么能有一个轮子?它永远是假的。
    • 这是一个突出问题行为的玩具示例,但为了更清楚,我更新了示例以使其更真实。
    • 更改示例代码后,您的代码可以正常运行。一探究竟。如果你不指定tail,它会喊尾巴。如果您指定所有三个,它会喊出所有三个。您可以(/应该)将您的 if 更改为 id self.wheel and self.window,因为 self.tail 始终为真。
    • (虽然消息应该是“选择尾部并且最多”多一个”)
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-02
      • 2021-04-18
      • 2020-05-04
      • 2011-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多