0

ビューで初期化するフォームセットがあります。フォームのフィールドの 1 つが FileField です。そして、以前のファイル名の名前をユーザーに表示する必要があります。FileFieldの初期化ができないので、ファイル名をリストで送りたい。(たとえば、Charfield がある場合は、ビューで初期化でき、テンプレートにレンダリングすると、そのデータで満たされた入力が表示されますが、ファイル アップロード フィールドがある場合は、ビューでそれを埋めることができず、テンプレートに送信します)。フォームセットとリストのフォームを同時にループする方法がわかりません。もう1つは、フォームセットでフォームを初期化し、テンプレートにレンダリングするときです(たとえば、書き込みますdata['form-0-Team']='team1'が、書き込みはできませんdata['form-0-Team']='a.png'、そのため、テンプレートにレンダリングすると、「チーム」という名前のフィールドが入力され (値 = team1)、「ファイル」という名前のフィールドが入力されず、「thid フィールドが必要です」というエラー ID が表示されます。) このページにアクセスするのは初めてですが、私のメソッドは POST ではありません。(通常、ユーザーが送信をクリックするとフォームエラーが表示され、ビューでrequest.method == 'POST'かどうかがチェックされ、次にform.is_validかどうかがチェックされ、テンプレートに戻ってエラーが表示されますが、私の場合はユーザーが初めてページにアクセスし、データを投稿する前)。私は私の問題を言うことができればいいのにと思います。これを解決する方法を教えてください。本当にありがとう。

def myFunc(request):
    flagFormSet = formset_factory(FlagFileBaseForm)
    if request.method == 'POST':
        formset = flagFormSet(request.POST, request.FILES)
        if formset.is_valid():
          # do s.th
    else:
         data = {
                    'form-TOTAL_FORMS': 5,
                    'form-INITIAL_FORMS': u'0',
                    'form-MAX_NUM_FORMS': u'',
                    # add initial form data to it
                }
         list=['a.png', 'b.png', 'c.png', 'd.png' , 'f.png']

         formset = flagFormSet(data)
    return render_to_response('myPage.html', RequestContext(request, { 'formset': formset, 'list':list}))

そして私のテンプレート:

<form method="post" action="" enctype="multipart/form-data">
{{ formset.management_form }}
    {% for form in formset.forms %}
        <div class="form">
           <div class="form-row Team">
              <div>
                <label class="required" for="id_Team">Team:</label>
                    {{ form.Team }}
                    {{ form.Team.errors }}
              </div>
           </div>                           
           <div class="form-row File">
               <div>
                  <label class="required" for="id_File">File:</label>
                       {{ form.File }}
                       {{ form.File.errors }}
               </div>

    #here i want show the name of previous file

           </div>
        </div>
    {% endfor %}
</form>

EDIT:現在の結果(リクエストが投稿されていない間、エラーが表示されます) ここに画像の説明を入力

望ましい結果 (ファイル名でエラーのないフォーム) ここに画像の説明を入力

4

2 に答える 2

1

Django テンプレートで、FileField を持つフォームをレンダリングしようとしている場合。置換を渡す必要があります

<form method="post" action="">

<form method="POST" enctype="multipart/form-data">

https://docs.djangoproject.com/en/dev/ref/forms/api/#binding-uploaded-files-to-a-form

于 2013-03-10T06:14:44.150 に答える
0

私はあなたの質問を本当に理解していないので、これが役に立たなかったら申し訳ありません..

リストが任意の場合 (質問から見えるように)、django の組み込みforloop カウンターを使用してファイル名を作成できます -

{% for form in formset %}
    {{ form }}
    <input type="text" name="file_name" value="{% forloop.counter %}.png">
{% endfor %}

あるいは、python のzip functionを見てください。これを使用して、名前とフォームの両方を含むオブジェクトを作成し、それをテンプレートに渡すことができます。

于 2013-03-10T09:03:48.600 に答える