【发布时间】:2012-11-18 17:59:59
【问题描述】:
我正在执行一个基本的 Django ModelForm 创建/验证/保存操作。在 Eclipse 调试器下运行代码时调用 is_valid() 时不会调用我的自定义清理方法,并且我在创建表单和调用 is_valid() 之后设置了断点。
我已经多次跟踪 Django 基本代码,似乎 ModelForm 类上的错误字典从未设置为 None,这会触发验证。我怀疑这是由于与访问 ModelForm 的 _errors 属性以显示在变量窗格中的调试器的交互。
当我移除所有断点并让代码自然流动时,我可以通过发出打印语句来证明自定义干净代码正在运行。
这是 Django ModelForm 设计中的缺陷、Eclipse 问题还是我找错了树?
models.py
from django.db import models
class TestModel1(models.Model):
field1 = models.CharField(max_length=45)
field2 = models.IntegerField(default=2)
field3 = models.CharField(max_length=45, null=True, blank=True)
forms.py
from order.models import TestModel1
from django.forms import ModelForm
class OrderTestForm(ModelForm):
def clean_field1(self):
return self.cleaned_data['field1']
def clean_field2(self):
return self.cleaned_data['field2']
class Meta:
model = TestModel1
我的测试工具:
from forms import OrderTestForm
row = {'field1': 'test value', 'field2': '4', }
ff = OrderTestForm(row)
#ff.full_clean()
if ff.is_valid():
ff.save()
else:
print ff.errors
【问题讨论】:
-
试试:ff = OrderTestForm(data=row)
-
感谢您的建议。我试过了,没有改变。我应该稍微澄清一下这个问题。如果我在 ModelForm 创建和 STEP 上有一个 Eclipse 断点然后恢复,则不会触发 clean 中的断点。但是在我迈出第一步后,清洁中的任何打印语句都会打印出来。这意味着,我相信,当 Eclipse 尝试访问 ModelForm 对象以读取其属性时,它会触发清理。根据 Django 文档,这是预期的行为。但是,它会产生一个问题,因为 is_valid() 将无法正常工作。
-
你能发布你的完整测试用例吗?
-
我确信调试器会访问 ModelForm 的“_error”属性,该属性会在该属性上创建一个空的 ErrorDict。根据代码和文档,访问属性会触发清理。然而,稍后当 is_valid 被调用时,它假定 _error 为“None”以触发 clean 方法。如果不是 None,则 is_valid 假定清理已经运行。这是一个奇怪的问题。
-
当我将已经从 objectinstance = Object.objects.create(**data) 创建的对象的实例传递给 ObjectForm 而不是原始数据时,我使用 pycharm 调用 clean 失败。形式 =ObjectForm(实例 = 对象实例)。当我将其更改为 form = ObjectForm(data = objectdata)。我的 clean 方法被调用了。