我正在使用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
如果不清楚,用户不会在此阶段添加任何信息 - 它是Accept
或Edit
,编辑允许用户编辑上一阶段添加的信息。任何人都可以提出任何建议,为什么这不起作用?或者我需要做些什么来解决它?
由于
答案 0 :(得分:0)
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()