【问题标题】:Django initiate form fields with model instanceDjango 使用模型实例启动表单字段
【发布时间】:2011-11-20 22:32:10
【问题描述】:

我认为它看起来微不足道,并感到惊讶。

我有什么

我有一个 Django 模型 + 表单(ModelForm)。

我的用户填写了表格,在我看来,我有通常的做法:

    if request.POST:
        form = myForm(request.POST)
    if request.method == "POST" and form.is_valid():
        result = form.save(commit=False) 

现在我需要大量操作表单的某些字段(在“结果”对象中),我想在保存之前再次检查表单is_valid()

问题

我尝试使用字典(建议 here)使用“结果”对象(即 ModelForm 对象)创建一个新表单

result_dictionary = dict((x.name, getattr(result, x.name)) for x in result._meta.fields) 

result_dictionary = model_to_dict(result, fields=[field.name for field in result._meta.fields])

testForm = myForm(initial=result_dictionary)

但它没有通过 is_valid() 并且没有给出任何错误! 字段通过 OK 传递给新表单...

有什么想法吗?

【问题讨论】:

  • 您是否有任何理由不使用“instance”参数从“result”对象创建表单? - 例如testForm = myForm(instance=result)
  • 高兴得太早了.. 这行不通。 testForm.is_bound => FalsetestForm.is_valid() => False

标签: django django-models django-forms django-views


【解决方案1】:

有时,查看 Django 源代码会很有帮助,这里是 BaseForm.is_valid()

def is_valid(self):
    """
    Returns True if the form has no errors. Otherwise, False. If errors are
    being ignored, returns False.
    """
    return self.is_bound and not bool(self.errors)

所以如果没有错误,is_valid() 将返回 false,因为您还没有绑定表单,也没有在任何地方给表单查找数据。尝试改用form.data 字典,如下所示:

if request.POST:
    form = myModel(request.POST)
if request.method == "POST" and form.is_valid():
    form.data['field1'] = 'Changing this'
    form.data['field2'] = 34

    testform = myModel(data=form.data)

【讨论】:

  • 在不改变其余部分的情况下,我测试了if testForm.is_bound:...,它返回 True。还是这个测试错了? (附注:我有一个错字并更正了我的问题 myModel-->myForm。不会改变任何东西 - 只是为了减少混淆)
  • 如果 testForm.is_bound 是 True,并且 testForm.errors 也是空的,那么 testForm.is_valid() 应该真的,真的返回 True,从我的所有逻辑意义上来说;) 你试过看 @987654330 @?
猜你喜欢
  • 2011-02-20
  • 1970-01-01
  • 2020-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 2013-08-27
相关资源
最近更新 更多