AJAX在新窗口中发布到django视图

时间:2013-08-21 05:47:28

标签: jquery ajax django

我正在尝试将一些表单变量从CreateView传递给TemplateView,其作用类似于预览,并呈现存储在request.session中的变量。我想在新窗口中打开预览。如果没有ajax帖子,预览会很好地加载。但是,当我在ajax帖子中添加时,窗口打开而没有传递后期数据。

打开窗口时没有发布数据。在视图中,绕过form_valid()。我究竟做错了什么?

有更好的解决方法吗?我应该在jquery中捕获提交事件而不是单击按钮吗?

CreateView的:

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

0 个答案:

没有答案