我正在尝试在用户点击按钮时进行对话,但我一直收到错误消息。这是我的代码。
请注意,我正在使用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
等于“这是一些文字”这样的话就行了,但我不知道我是什么做错了。
答案 0 :(得分:3)
context_instance
中的render_to_string
参数需要Context
个实例,而get_context_data
则返回字典。有几种方法可以解决这个问题:
1)提供Context
个实例,最好是RequestContext
。 RequestContext
将执行所有上下文处理器,因此模板可以使用request
和user
等默认变量:
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)