2

CSV ファイルからのインポートを許可するアプリケーションがあります。ライブラリのリストは CSV ファイルに含まれています。最初にそれらをライブラリ インスタンスのリストに解析し、別のページに表示する必要があります。ユーザーが [確認] をクリックすると、これらのライブラリが保存されます。

ここに私のフォームがあります:

class LibCsvForm(forms.Form):
    lib_csv  = forms.FileField(label='CSV file')

class LibListForm(forms.Form):
    def __init__(self, *args, **kwargs):
        new_libs = kwargs.pop('new_libs')
        super(LibListForm, self).__init__(*args, **kwargs)
        self.fields['new_libs'] = new_libs

そして私の見解:

def import_lib_csv(request):
    if request.method == 'POST':
        form = LibCsvForm(request.POST, request.FILES)
        if form.is_valid():
            raw = request.FILES['lib_csv'].read()
            new_libs = []
            # Process string 'raw' and add instances of Library to new_libs
            context = RequestContext(request, {'form': LibListForm(new_libs=new_libs)})
            context.update(csrf(request))
            return render_to_response('master/library.csv.confirm.html', context)
    else:
        form = LibCsvForm()
    variables = RequestContext(request, { 'form': form })
    return render_to_response('master/library.csv.html', variables)

LibCsvForm は、ユーザーがファイルをアップロードするためだけのものです。メソッド「import_lib_csv」は、ファイルを読み取り、インスタンスを作成し、「new_libs」のみを含む別のフォーム LibListForm に渡します。ユーザーが「確認」をクリックした後、このリストを取得してオブジェクトを保存したいと思います。

問題は、テンプレートで次のことです。

{{ form.new_libs }}
{% for lib in new_libs %}
     {{ lib.id }}
{% endfor %}

何も表示されません。「new_libs」をフォームに適切に渡さなかったと思います。誰か助けてくれませんか?ありがとう。


編集:

ありがとう、ローハン。ご指摘のとおり修正しました。これで、テンプレートにライブラリ リストを表示できるようになりました。「new_libs」はライブラリ インスタンスのリストです。

しかし、「確認」をクリックすると、エラーが報告されます。保存する私の方法は次のとおりです。

def save_lib_list(request):
    if request.POST:
        form = LibListForm(request.POST)
        print form.cleaned_data['new_libs']
    variables = RequestContext(request, {
        'lib_list': Library.objects.all()
    })
    return render_to_response('master/library.list.html', variables) 

ジャンゴ 言う

"Exception Type:    KeyError
Exception Value:    'new_libs' "

私のテンプレートは次のとおりです。

<form method="post" action="/library/savelist/" class="well">
    {% csrf_token %}
    <legend>Libraries to import</legend>
    {% for lib in new_libs %}
        {{ lib.id }}
    {% endfor %}
</form>

ここで何かが足りないと思いますが、解決方法がわかりません...


解決済み:

アップロードした CSV ファイルの内容を先にサーバーに保存します。このファイルのパスを LibListForm の非表示フィールドとして設定します。

tmp_lib_file = forms.CharField(widget=forms.HiddenInput(), initial='tmp.lib')

次に、ユーザーが「確認」をクリックすると、ファイルを再度解析し、ライブラリのインスタンスを取得して保存します。

4

2 に答える 2

2

new_libsテンプレートで使用する場合は、テンプレートコンテキストにを追加する必要があります。

context = RequestContext(request, {'form': LibListForm(new_libs=new_libs), 'new_libs': new_libs})

また、new_libsあなたが渡すものの種類は何LibListFormですか?適切なフィールドタイプではない場合、適切に表示/処理されない場合。

質問編集後の更新:

  • new_fieldsエラーは、にキーがないことを示していform.cleaned_dataます。フォームには、その名前のフィールドが必要です。new_fieldフォームフィールドではないようです。
  • また、テンプレートにフォームフィールドがありませんか?
于 2012-09-01T17:33:33.847 に答える
0

new_libs何が想定されているのかはまったくわかりませんが、フォームフィールドではないようです。

当然のことながら、フォームにはフォームフィールドのみが表示されます。これらのオブジェクトをフォームに配置する理由がよくわかりません。実際には、テンプレートにオブジェクトをリストして、[確認]ボタンを追加したいようです。そのためのフォームクラスは必要ありません。実際のオブジェクトと同じようにテンプレートに渡し、繰り返し処理して、確認ボタンを基本的なHTMLフォームに配置するだけです。

于 2012-09-01T17:38:33.320 に答える