调试表单验证在Pycharm(Debugging form validation in Pychar

2019-06-27 10:36发布

我试图调试表单验证在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():
            ...

Answer 1:

这是一个真正的痛苦。 我有这个问题两次,仍然没有找到很好的解决办法。

这是当你覆盖形式的安全调试的例子__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方法和形式实例化点和断点之间不停止。



文章来源: Debugging form validation in Pycharm