2014-04-06 170 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)