【问题标题】:Django ModelForm not calling cleanDjango ModelForm 不调用 clean
【发布时间】: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 方法被调用了。

标签: python django eclipse


【解决方案1】:

如果你尝试怎么办:

from order.models import TestModel1
from django.forms import ModelForm

class OrderTestForm(ModelForm):
    class Meta:
        model = TestModel1

    def clean_field1(self):
        value = self.cleaned_data['field1']
        print value 
        return value

    def clean_field2(self):
        value = self.cleaned_data['field2']
        print value 
        return value

【讨论】:

  • 我遇到了和 OP 一样的问题,也没有调用各个字段清理器。
【解决方案2】:

我找到了“答案”,这是一种非答案。确切的用例是从客户那里接收 CSV 文件。在检查了客户的实际数据文件后,数据字段被填充了空格——很多空格。我修剪了输入并将修剪过的字典推到表单中,一切正常。仍然没有解释为什么 eclipse 对此感到窒息。

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,并尝试深入挖掘并调试框架。

    常规表单和模型表单之间可能存在差异,导致这不起作用,但是这个 hack(覆盖 is_valid() 而不是 clean(...))对我有用:

    def is_valid(self):
        #run whatever ModelForm validations you need
        return super(OrderTestForm, self).is_valid()
    

    【讨论】:

    • 问题是你不能在那个方法中触摸`self.cleaned_data[]`,因为它还没有被创建。
    猜你喜欢
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 2013-10-06
    • 2019-11-22
    • 2018-05-31
    • 2023-03-15
    • 2015-10-08
    相关资源
    最近更新 更多