2

フォームを保存する前に、フォームのインスタンスを変更しようとしています。ビュー内に次のような特定の情報を設定する必要があります。

 class UploadedFile(models.Model):

     file = models.FileField(storage=s3store, upload_to=custom_upload_to)
     slug = models.SlugField(max_length=50, blank=True)
     bucket = models.ForeignKey(S3Bucket, blank=False)
     uploaded_by = models.ForeignKey(User, related_name='uploaded_by', blank=False)
     company = models.ForeignKey(Company, blank=False)

-

class UploadForm(ModelForm):

    class Meta:
        model = UploadedFile    

-

form = UploadForm(request.POST, request.FILES)
form.instance.company_id = r_user.company.id
form.instance.uploaded_by_id = r_user.id
form.instance.bucket_id = r_user.company.s3_bucket_id
if form.is_valid():
     form_object = form.save()

会社/アップロード済み/バケットが空であるため、フォームが無効であることがわかりました。

エラーフォーム:

  • 会社
  • この項目は必須です。
  • バケツ
  • この項目は必須です。
  • upload_by
  • この項目は必須です。
  • しかし、私はそれらを設定しました!それらをblank=Trueにしてから、save(commit = false)を実行し、それらを変更してから、再保存する必要がありますか?はいの場合、なぜそうですか?形を変えました…。

    4

    3 に答える 3

    2

    これを試して:

    data = request.POST.copy()
    data['company_id'] = r_user.company.id
    data['uploaded_by_id'] = r_user.id
    data['bucket_id'] = r_user.company.s3_bucket_id
    
    form = UploadForm(data, request.FILES)
    if form.is_valid():
         form_object = form.save()
    

    このようにして、フォームを作成する前にデータを設定します。

    于 2012-05-25T18:23:02.780 に答える
    1

    割り当てが遅れています。__init__()of 、ModelFormまたはコード:form = UploadForm(request.POST, request.FILES)行で、インスタンスが作成されinitial、フォームに入力されています。インスタンスを後で変更しても、の値には影響しませんform.initial

    また、バックエンドで一部のフィールドに自動的に入力する場合は、それらをユーザーにレンダリングしないでください。

    したがって、はい、それらを作成するblank=True、フォームから除外して、提案された方法に従うことができます。

    于 2012-05-23T15:38:54.030 に答える
    0

    実際、あなたはここでいくつかの奇妙なことをします。

    最初に:なぜ、、に割り当てるcompany_iduploaded_by_idですbucket_idか?ただし、モデルにこれらのフィールドがあります。これは、このモデル用に作成されたテーブルの列の名前です。たとえば、ここで直接ORM機能を使用する必要がありますform.instance.company = r_user.company

    2番目:フォームの検証は、そのインスタンス属性ではなくform.fieldsに適用されます。フォームが作成され、指定された値にバインドされると、フォームを変更することはできません。

    Djangoのフォームによって作成されたモデルインスタンスにいくつかのフィールド値を追加するための推奨される方法は(私がいつも思っていたように)、カスタムModelFormを作成し、Metaクラスでユーザーが編集できるようにするすべてのフィールドを指定することです。あなたの場合:

    class UploadForm(ModelForm):
    
        class Meta:
            model = UploadedFile
            fields = ('file', 'slug')
    

    次に、呼び出す代わりに、を呼び出しform_object = form.save()ますform_object = form.save(commit=False)。これで、フォームのすべてのフィールドがすでに入力されたモデルインスタンスが取得されたので、必要なものを追加できますform_object.company = r_user.companysave()最後に、モデルインスタンス自体を呼び出して、データベースに保存することを忘れないでください。

    このソリューションは、ここのDjangoドキュメントで説明されています

    于 2012-06-17T12:09:55.413 に答える