2014-04-06 129 views
2

我试图做一个对话框,当用户点击一个按钮,但我不断收到一个错误。这是我的代码。Django基于类的ajax视图?

请注意,我使用django-braces来捕捉ajax调用。

观点:

class UserRegistration(braces.AjaxResponseMixin, CreateView): 
    form_class = UserRegistrationForm 
    template_name = "registration_form.html" 

    def get_ajax(self, request, *args, **kwargs): 
     context = self.get_context_data(**kwargs) 
     rendered = render_to_string(self.template_name, context_instance=context) 
     return HttpResponse(rendered) 

的Javascript:

$("#signup").on("click", function(){ 
    $("body").append("<div id='dialog' title='Register'></div>"); 
    $("#dialog").dialog({ 
     height: 'auto', 
     width: 'auto', 
     modal: true, 
     autoOpen: false 
    }); 

    $.ajax({ 
     url: '/signup/', 
     data: {}, 
     type: 'GET', 
     success: function(data){ 
      $("#dialog").html(data); 
      $("#dialog").dialog("open"); 
     }, 
     error: function(error) { 
      alert("failure"); 
     } 
    }); 
}); 

我知道这事做render_to_string,因为如果我只是设置rendered等于类似“这是一些文本”它会工作,但我不确定我做错了什么。

回答

3

context_instance参数render_to_string需要一个Context实例,而get_context_data返回一个字典。有几种方法可以解决这个问题:

1)提供Context实例,最好是RequestContext。一个RequestContext将执行所有上下文处理器,所以像requestuser默认变量可用于模板:

from django.template import RequestContext 

def get_ajax(self, *args, **kwargs): 
    context = self.get_context_data(**kwargs) 
    rendered = render_to_string(self.template_name, 
           context_instance=RequestContext(self.request, context)) 
    return HttpResponse(rendered) 

2)传递上下文字典,使用dictionary参数:

def get_ajax(self, *args, **kwargs): 
    context = self.get_context_data(**kwargs) 
    rendered = render_to_string(self.template_name, dictionary=context) 
    return HttpResponse(rendered) 

3 )由于您只是将渲染的字符串传递到HttpResponse对象中,因此可以跳过render_to_string,并使用render代替:

from django.shortcuts import render 

def get_ajax(self, *args, **kwargs): 
    context = self.get_context_data(**kwargs) 
    return render(self.request, self.template_name, context)