在我的视图函数中,我想返回一个json对象(data1)和一些text / html(form)。这可能吗?
以下是 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 :(得分:10)
只需将两个数据放在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);
})
答案 1 :(得分:4)
from django.http import JsonResponse
response_data = {put your data into a dict}
return JsonResponse(response_data, status=201)
答案 2 :(得分: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')