代码之家  ›  专栏  ›  技术社区  ›  khelll

Django格式错误

  •  5
  • khelll  · 技术社区  · 15 年前
    class JobForm(forms.ModelForm):
        class Meta:
            model = models.Job
    

    那是我的表单,现在尝试保存它会引发异常,并且尝试验证它只是失败而没有错误…

    job = get_object_or_404(models.Job, pk=1)
    form = forms.JobForm(instance = job)
    try:
        form.save()
    except:
        print sys.exc_info()
    
    #=>(<type 'exceptions.AttributeError'>, AttributeError("'JobForm' object has no attribute 'cleaned_data'",), <traceback object at 0x1029dbb48>)
    

    试图验证它:

    if form.is_valid():
        form.save()
    else:
        print 'error'
        print form.errors, len(form.errors)
    #=> 'error' 
    #=> 0
    

    所以表格是无效的,但是没有错误! 有什么想法吗?

    2 回复  |  直到 15 年前
        1
  •  18
  •   Felix Kling    15 年前

    你的表格绝对不受约束。阅读有关 Bound and Unbound forms .

    从文件中:

    若要将数据绑定到窗体,请将数据作为 词典 作为 第一个参数 对你 窗体类构造函数

    这意味着模型中字段的更改也不会使窗体绑定。必须通过构造函数显式传递这些值。但是:

    请注意,传递 空字典 创建一个 约束形式 空数据

    考虑一下这个

    如果您有一个绑定的表单实例并希望以某种方式更改数据,或者如果您希望 绑定未绑定的窗体 一些数据的实例, 创建另一个表单实例 . 无法更改表单实例中的数据。创建表单实例后,应考虑其数据 不变的 ,无论它是否有数据。

    如果您验证 未绑定的 形式:

    在没有数据的情况下验证表单是没有意义的,但是,据记录,下面是未绑定表单的情况:

    >>> f = ContactForm()
    >>> f.is_valid()
    False
    >>> f.errors
    {}

        2
  •  3
  •   Adam    15 年前

    我最好的猜测是,您不能保存一个只使用实例数据创建的模型表单(我刚刚尝试对我的一个表单执行此操作,得到了完全相同的错误),因为在您传递额外信息之前,表单不会成为绑定表单。仅仅将模型中已经存在的数据提供给表单(然后再次保存)是没有意义的,因为不会有任何更改。如果这是来自HTML表单,则还应将request.post(或request.get)传递到表单。