2012-01-29 30 views
9

在我的视图函数中,我想返回一个json对象(data1)和一些文本/ html(表单)。这可能吗?是否有可能在文本和json对象的django中返回一个HttpResponse?

这里是我的views.py的一部分:

if request.is_ajax() and request.method == 'POST': 
... 
    if form.is_valid(): 
     answer = form.cleaned_data['answer'] # Answer extracted from form is also a string 
     a1 = ques1.correct_answer 
        if a1 == answer: 
      test1 = question_list.get(id=nextid) 
      form = AnswerForm(test1) 
      ques1 = question_list.filter(id=nextid)      # Filter next question as <qs> 
      data1 = serializers.serialize("json",ques1)     # Json-ize 
    # ********EDITED HERE **********   
      variables1 = Context({ 
       'form' : form, 
       'q1' : data1, 
      }) 
      #response = HttpResponse() 
      #response['data1'] = response.write(data1) 
      #response['form'] = response.write(form) 
      if nextid <= qsnlen: 
       return HttpResponse(variables1, mimetype="application/json") 
       #return HttpResponse(response) 
      else: 
... 

我想回送两个HTML表单和ques1 JSON对象。我怎样才能做到这一点?提前致谢。

回答

0

用一个响应来做到这一点;您需要在模板响应(HTML)的上下文中以纯文本格式发送JSON。

如果您需要发送JSON作为单独的JSON对象,并使用其自己的MIME类型,则需要编写两个视图;一个发回JSON为application/json,另一个发回表单(HTML)。

编辑:

不必返回JSON对象,但你却拒绝有两种不同类型的两个项目的字典。正如我在评论中解释的那样,在一个请求/响应周期中;您只能返回一个具有基于内容的特定MIME类型的响应,以及您希望浏览器如何处理它。大多数情况下,内容类型为'text/html'

在你的场景中,如果你想返回HTML(这是你的表单)和JSON响应(这是一个字符串),你需要返回HTML。

如果您想将JSON作为JSON对象返回给Jquery;您需要检测请求类型。在您的前端(模板)中,您将发起两个请求 - 一个来自浏览器,它将返回表单。另一个来自jQuery,它将返回适当的JSON对象。

这里是一个可能的方法是:

def foo(request): 
    if request.is_ajax(): 
     ctx = dict() 
     ctx['hello'] = 'world' 
     return HttpResponse(json.dumps(ctx),content_type='application/json') 
    else: 
     return HttpResponse('hello world') 
+0

只是要100%清楚 - 我送表单数据一个HttpRequest的POST请求(通过ajax),所以我只能将它路由到一个视图函数。在我的场景中,当用户提交问题的答案时,我想接收这些数据,对其进行处理,然后发回另一个问题json对象和一个新的输入表单。 – 2012-01-29 07:38:00

+0

您可以返回一个响应,并在上下文中包含多个对象。这可以只有一个_mime type_ - 所以你可以在回复中发送多个项目;但是你*不能*在一个响应中结合两个MIME类型。 在你的例子中,你将mimetype设置为'application/json'。你可以在技术上发送你想要的任何东西,并把mimetype当作任何东西,但是这不会在客户端做你想要的。 发送表单和JSON对象的HTML - 将JSON对象添加到响应的上下文中。 – 2012-01-29 08:16:28

+0

请检查上面编辑的代码。我将表单和json对象都添加到上下文中,然后我将它发回。你是这个意思吗?请问json对象在客户端读取正确(我正在使用jQuery)?我想,在客户端阅读这将是一个噩梦。我没有使用RequestContext,因为有更多的变量返回,我不需要。谢谢你的帮助。 – 2012-01-29 09:04:37

9

只要把数据的两件在JSON容器,一个键与表单数据和一个与HTML作为呈现字符串。在浏览器中,你可以将两个键都拿出来做&做你的事情。

在你看来:

form_json_data = get_form_json_data() 
rendered_html = get_the_html() 
return HttpResponse(json.dumps({ 
     "formdata": form_json, 
     "html": rendered_html}), 
    content_type="application/json") 

在JS:

$.post(foo, postdata, function(data){ 
    var formdata = data.formdata 
    var html = data.html; 
    $(".html-target").replaceWith(html); 
    do_whatever(formdata); 
}) 
+0

我尝试了你的建议,但问题是上面的'ques1'是一个查询集,而json.dumps抱怨说无法序列化这个查询集。事实上,即使您尝试序列化对象('test1'),它也会抱怨。另外,在上面的代码中,我想要发回的两件事是表单和问题对象。 – 2012-01-29 14:45:00

+2

嗯,你不能JSON序列化Python对象。本身不能发送'问题对象';你只能发送对象属性的JSON字典。 Django有一个[内置的序列化助手](https://docs.djangoproject.com/en/dev/topics/serialization/#serializing-data),可以处理查询集。 – AdamKG 2012-01-29 16:44:21

3

使用JsonResponse

from django.http import JsonResponse 
response_data = {put your data into a dict} 
return JsonResponse(response_data, status=201) 
相关问题