0

私はModelFormを使用していますが、これは完全に機能していました。ユーザーは複数のオブジェクトを連続して作成しており、各オブジェクトは先行するオブジェクトを外部キー関係に持っています。これはうまく機能していましたが、突然壊れてしまい、何をしたのかわかりません。問題は、フィールドの 1 つで、入力されているにもかかわらず、入力されていないことを示すエラーが発生し続けることです。フィールド {{ .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'})

二重に奇妙なのは、 afterif 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前の段階で追加された情報を編集できます。なぜこれが機能しないのかについて、誰かアドバイスをいただけますか? または、それを修正するために何をする必要がありますか?

ありがとう

4

1 に答える 1

0

フォームのドキュメントはこれについて非常に明確です:

これらの [初期] 値は、バインドされていないフォームに対してのみ表示され、特定の値が提供されていない場合、フォールバック値として使用されません。

フィールドを「非表示」として含めることのポイントが何であるかはわかりませんが、インスタンス化でそれらを埋めます。フォームにフィールドが必要ない場合は、それらを除外し、モデル インスタンス自体に設定します。

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()
于 2013-06-28T18:20:35.090 に答える