【问题标题】:Form error even when filled in即使填写了表格错误
【发布时间】:2013-06-28 18:14:42
【问题描述】:

我正在使用 ModelForm 并且它运行良好。用户连续创建多个对象,每个对象在外键关系中都有前一个对象。这一直很好,但它突然坏了,我不确定我做了什么。问题似乎是其中一个字段不断引发错误,表明它没有填写,即使它是。我正在渲染字段 {{ .as_hidden }} 并传递一个初始值,因此用户无法更改他们的值,但如果我有表单打印它表明在我测试它是否有效之前,我可以看到给定初始值的字段确实具有这些初始值。

这是视图:

def new2(request, number):
  if not (request.user.is_authenticated()):
    return render(request, 'denied.html', {'message': 'You must log in before you can make a new entry.'})
  po=PurchaseOrder.objects.get(pk=number)
  today = datetime.date.today()
  if request.method == 'POST':
    form = WorkflowForm(request.POST, initial={'purchase1': PurchaseOrder.objects.get(pk=number), 'state': 'request', 'date_created': today})
    if form.is_valid():
      new_flow = form.save()
      addresses = User.objects.filter(groups__name='Operations').values_list('email', flat=True)      
      email = EmailMessage('New Workflow Entry',
               get_template('new-workflow-email.html').render(
                 Context({
                   'ponumber': new_flow.purchase.po_number,
                   'user': new_flow.purchase.user,
                   'customer': new_flow.purchase.customer,
                   'pk': new_flow.pk,
                   })
                 ),
                 to = addresses)
      print ('Sending email')
      email.send()
      return HttpResponseRedirect('/workflow/list/request/')
    else:
      return render(request, 'new-workflow.html', {'form': form, 'purchase': po})
  else:
    form = WorkflowForm(initial={'purchase1': PurchaseOrder.objects.get(pk=number), 'state': 'request', 'date_created': today})
    return render(request, 'new-workflow.html', {'form': form, 'purchase': po, 'type': 'New'})

更奇怪的是,在调用if form.is_valid(): 之后,表单并没有正确设置其初始值。

我不知道该表格是否会有所帮助,但以防万一。

class WorkflowForm(ModelForm):
  purchase1=forms.ModelChoiceField(queryset=PurchaseOrder.objects.all(), required=False)
  purchase2=forms.ModelChoiceField(queryset=Phase2.objects.all(), required=False)
  details = forms.CharField(required=False)


  date_created=forms.DateField(required=False)
  date_approved=forms.DateField(required=False)


  class Meta:
    model = POObject

如果不清楚,用户在此阶段不会添加任何信息——它是AcceptEdit,编辑允许用户编辑在前一阶段添加的信息。任何人都可以就为什么这不起作用提供任何建议吗?或者我需要做什么来修复它?

谢谢

【问题讨论】:

  • 你的 POObject 模型是什么样的?由于您已将所有自定义表单字段声明为不需要,因此如果您收到有关未提供必填字段的错误,则可能是从 POObject 模型派生的自动字段之一。
  • 我没有包含模型,因为正如我所说,所有字段都设置在 initial={ ... } 短语中。仍然需要的字段是 state,但正如您在上面看到的,在实例化表单时它被赋予了一个值。
  • 好吧,如上所述,当您绑定到 POST 数据时,这无济于事。如果无法编辑state,请不要将其包含在表单中。
  • 是的,我同意这是糟糕的设计。就是奇怪,之前能用,突然就停了。

标签: django forms validation django-forms


【解决方案1】:

forms documentation 对此非常明确:

这些 [初始] 值仅针对未绑定的表单显示,如果未提供特定值,它们不会用作备用值。

我不确定将字段包含为“隐藏”但然后在实例化时填充它们的意义何在。如果您不想要表单中的字段,请排除它们并将它们设置在模型实例本身上:

class WorkflowForm(ModelForm):
    class Meta:
        exclude = ('purchase1', 'state', 'date_created')


...

if form.is_valid():
    new_flow = form.save(commit=False)
    new_flow.state = 'request'
    new_flow.purchase1 = po
    new_flow.save()

【讨论】:

  • 是的...解决了它。奇怪,前两天还在工作,不知道为什么现在决定不工作了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多