DetailView中的return_to_string

时间:2016-02-16 20:03:41

标签: django

我试图在我的DetailView中render_to_string部分,以便通过json将渲染的html发回给ajax来拾取。

我的views.py看起来像这样:

class ProfileDetails(DetailView):
    model = UserProfile

    def get_object(self, queryset=None):
        response_data = {}
    response_data['content'] = render_to_string("profile/userprofile_detail/content.html", self.get_context_data())
    if request.is_ajax():
        return HttpResponse(
             json.dumps(response_data),
            content_type="application/json"
        )
    else:
        return get_object_or_404(
            UserProfile, 
            user__username=self.kwargs['username'],
        )

这不起作用,因为我刚收到此属性错误:

  

' ProfileDetails'对象没有属性' object'

我在线搜索了如何执行此操作,但对于我需要使用自定义网址参数的情况,这还不够。

如何才能使我的工作目前如何设置?我唯一的目标是将渲染的部分发送给ajax,但我需要先实现渲染它。

1 个答案:

答案 0 :(得分:1)

我认为你没有正确地覆盖get_object()方法。您的实现可以返回一个HttpResponse对象,DetailView似乎无法正确显示该对象。即使它可以序列化HttpResponse对象,你的代码也会尝试显示你正在构建的HttpResponse对象的字段/值,当你真正想要的是view返回HttpResponse对象本身。你想要做的是删除get_object方法中的所有ajax检测,序列化和响应生成逻辑,并将其移动到视图的get()方法的覆盖中,以实现以下效果:

def get(self, request, *arg, **kwargs):
    if request.is_ajax():
       # Generate and return your HttpResponse object here
    return super(ProfileDetails, self).get(request, *args, **kwargs)

get方法的返回值应该是一个HttpResponse对象,基本View类知道如何处理。我建议您查看基于类的视图的文档,以便更好地了解它们如何处理请求/响应。