我试图调试表单验证在Django与Pycharm。 我的表单验证失败时,在我通过ImageField的上传图片,我想找出为什么它的失败就可以了。 但是,每当我尝试调试验证过程并步入并通过与POST数据的形式初始化,它甚至不尝试验证,并在年底抛出,因为空字段的错误试图保存表单数据的时数据库。 这是推动我坚果...如何行为的变化取决于我是否遵守各个步骤或没有? 我也试着设置几个破发点,例如在基本形式类的满干净的方法中,但它似乎没有过那里。
编辑:下面是一些代码
我的模型和形式:
class Car(models.Model):
...
image = models.ImageField(upload_to='car_images/',blank=True,null=True)
class CarForm(ModelForm):
class Meta:
model = Car
我的看法:
def create_car(request):
if request.method == 'POST':
car_form = CarForm(request.POST,request.FILES)
if car_form.is_valid():
...
这是一个真正的痛苦。 我有这个问题两次,仍然没有找到很好的解决办法。
这是当你覆盖形式的安全调试的例子__init__
方法。
class MyForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
# Disable form validation for debugging purposes unless the
# object is fully initialized. Set breakpoints BELOW this line.
del self._errors
# Write some additional initializations here, debug safely.
...
# Initialization is finished. Enable form validation.
self._errors = None
如果你要调试的基本形式类,然后修补以同样的方式Django的代码。
你可以离开或调试完毕后删除此额外的代码 - 这没有显著差异。 但最好是离开你需要这个在未来的情况。
那么,什么是真正回事?
(在Django项目现场错误报告: https://code.djangoproject.com/ticket/24710 )
看来问题是,Django的BaseForm.errors
属性getter(这是真的有方法@property
装饰)做太多。 它调用full_clean()
这改变了方法_errors
使物业价值errors
吸气不会再重复上做调用同样的工作。
class BaseForm(object):
@property
def errors(self):
if self._errors is None:
self.full_clean()
return self._errors
def full_clean(self):
self._errors = ErrorDict()
...
当然PyCharm调试器假设性只是属性,他们不这样做的对象的内部状态的关键变化。 因此,调试器调用errors
吸气剂,以显示它的价值在“变量”窗口,当你调试__ini__
方法。 这打破了正常的执行流程。
(这就是为什么你应该这样定义方法get_error()
在这种情况下,不属性)
一个可能的建议可能是避免断点和一步一步执行窗体的内__init__
方法。 但如果你真的需要调试然后修改代码,以便_errors
属性不台阶一步的执行过程中存在。 这将防止来电full_clean
方法。 PyCharm调试器每次都会收到它会尝试访问错误errors
属性。
注意 : errors
属性可以在当执行暂停任何步骤进行评估,外连的__init__
方法。 这可能不会影响结果,如果所有字段都已经完全初始化(记得要做到这一点的__init__
唯一方法)。 然而,你可能会发现你,因为你到达之前的形式出现的验证仍然无法调试形式验证过程is_valid
方法调用。 在这种情况下设置的内部断点full_clean
方法和形式实例化点和断点之间不停止。