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