いくつかのフォーム変数を CreateView から TemplateView に渡そうとしています。これはプレビューのように機能し、に格納されている変数をレンダリングしますrequest.session
。プレビューを新しいウィンドウで開きたいです。ajax の投稿がなければ、プレビューは適切に読み込まれます。しかし、ajax投稿に追加すると、投稿データが渡されずにウィンドウが開きます。
投稿データなしでウィンドウが開きます。ビューでは、form_valid() はバイパスされます。私は何を間違っていますか?
これを回避するより良い方法はありますか?ボタンのクリックではなく、jquery で送信イベントをキャプチャする必要がありますか?
ビューの作成:
def form_valid(self, form):
if form.is_valid():
if self.request.POST.get('submit'):
self.object = form.save(commit=False)
self.object.profile = self.request.user.get_profile()
self.object.save()
return super(InvoiceCreateView, self).form_valid(form)
elif self.request.POST.get('preview') and self.request.is_ajax():
data = form.cleaned_data
# Obtain form data, redirect only if template is not empty
if data['template'] and data['customer']:
self.request.session['template'] = data['template']
self.request.session['customer'] = data['customer']
return redirect('invoices:invoice_preview')
else:
messages.error(request, u"Unable to preview")
return self.render_to_response(self.get_context_data(form=form))
else:
messages.error(self.request, u"Invoice creation failed")
return self.render_to_response(self.get_context_data(form=form))
js:
$("#submit-id-preview").click(function() {
$.ajax({
type: "POST",
async: false, // opens in tab if available
url: "{% url "invoices:invoice_create" %}",
data: {
csrfmiddlewaretoken: "{{csrf_token}}",
},
success: function() {
window.open("{% url "invoices:invoice_preview" %}", "_blank");
},
error: function() {
alert('ouch'); // failed
},
});
return false;
});
編集 (プレビュー ビュー):
def get_context_data(self, **kwargs):
context = super(InvoicePreview, self).get_context_data(**kwargs)
try:
context['preview'] = True
context['template'] = self.request.session['template']
context['customer'] = self.request.session['event']
context['preview_message'] = self.request.session['preview_message']
except KeyError:
return Http404 # just throw 404 if cookie fails
return context
プレビューは、セッションで渡された変数を使用していくつかのものをレンダリングしますtemplate
。特に、.css + html ファイル参照が保存され、ユーザーの選択に基づいて返されます。したがって、ajax の投稿がなくても、プレビューは実際には適切にレンダリングされます。一方、ajaxを使用すると、argument of type 'type' is not iterable
.