使用ajax的Django基于类的视图?

时间:2014-04-06 21:51:54

标签: javascript jquery python ajax django

我正在尝试在用户点击按钮时进行对话,但我一直收到错误消息。这是我的代码。

请注意,我正在使用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等于“这是一些文字”这样的话就行了,但我不知道我是什么做错了。

1 个答案:

答案 0 :(得分:3)

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

1)提供Context个实例,最好是RequestContextRequestContext将执行所有上下文处理器,因此模板可以使用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)