2012-01-29 22 views
9

Trong hàm xem của tôi, tôi muốn trả về một đối tượng json (data1) và một số văn bản/html (biểu mẫu). Điều này có thể không?Có thể trả lại một HttpResponse trong django với văn bản và một đối tượng json không?

Dưới đây là một phần của views.py tôi:

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: 
... 

tôi muốn gửi lại cả html hình thức và đối tượng ques1 json. Tôi có thể làm cái này như thế nào? Cảm ơn trước.

Trả lời

0

Để thực hiện việc này với một câu trả lời; bạn cần gửi JSON dưới dạng văn bản thuần túy trong ngữ cảnh phản hồi mẫu của bạn (HTML).

Nếu bạn cần gửi JSON dưới dạng đối tượng JSON riêng biệt, với loại mime riêng, thì bạn cần phải viết hai chế độ xem; người gửi lại JSON dưới dạng application/json và người kia gửi lại biểu mẫu (HTML).

EDIT:

Bạn chưa trở về đối tượng JSON, nhưng bạn đang chuyển sang một cuốn từ điển có hai mục của hai loại khác nhau. Như tôi đã giải thích trong các ý kiến, trong một chu kỳ yêu cầu/đáp ứng; bạn chỉ có thể trả lại một câu trả lời có loại mime cụ thể dựa trên nội dung và cách bạn muốn trình duyệt xử lý nó. Hầu hết thời gian loại nội dung là 'text/html'.

Trong trường hợp của bạn, nếu bạn muốn trả lại cả HTML (đó là biểu mẫu của bạn) và phản hồi JSON (là một chuỗi), bạn cần trả về HTML.

Nếu bạn muốn trả về JSON thành Jquery dưới dạng đối tượng JSON; bạn cần phát hiện loại yêu cầu. Trong giao diện người dùng của bạn (các mẫu), bạn sẽ bắt đầu hai yêu cầu - một từ trình duyệt, một trình duyệt sẽ trả về biểu mẫu. Cái kia từ jQuery, cái sẽ trả về đối tượng JSON thích hợp.

Dưới đây là một phương pháp có thể để điều này:

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

Chỉ cần được 100% rõ ràng - Tôi gửi một yêu cầu POST HttpRequest mẫu dữ liệu (thông qua ajax), vì vậy tôi chỉ có thể định tuyến nó đến một chức năng xem. Trong kịch bản của tôi, khi người dùng gửi câu trả lời cho một câu hỏi, tôi muốn lấy dữ liệu đó, làm những việc với nó, và sau đó gửi lại một đối tượng json câu hỏi khác và một biểu mẫu đầu vào mới. –

+0

Bạn có thể trả về một câu trả lời, với nhiều đối tượng trong ngữ cảnh. Điều này có thể chỉ là một _mime type_ - vì vậy bạn có thể gửi nhiều mục trong một phản hồi; nhưng bạn * không thể * kết hợp hai loại mime trong một câu trả lời. Trong ví dụ của bạn, bạn đang đặt mimetype là 'application/json'. Bạn về mặt kỹ thuật có thể gửi bất cứ điều gì bạn muốn và đặt mimetype như bất cứ điều gì, nhưng điều này sẽ không làm những gì bạn muốn vào cuối khách hàng. Để gửi HTML cho biểu mẫu và đối tượng JSON - thêm đối tượng JSON vào ngữ cảnh của phản hồi. –

+0

Vui lòng kiểm tra mã đã chỉnh sửa ở trên. Tôi đã thêm cả biểu mẫu và đối tượng json vào ngữ cảnh, và tôi gửi nó trở lại. Ý bạn là vậy đúng không? Liệu đối tượng json có đọc chính xác ở phía máy khách (tôi đang sử dụng jquery) không? Đọc điều này ở phía khách hàng sẽ là một chút ác mộng, tôi nghĩ vậy. Tôi đã không sử dụng RequestContext vì có nhiều biến hơn được trả lại mà tôi không cần. Cảm ơn bạn đã giúp đỡ. –

9

Chỉ cần đặt cả hai mẩu dữ liệu trong một container JSON, một chìa khóa với dữ liệu mẫu và một với HTML như là một chuỗi kết xuất. Trong trình duyệt, bạn chỉ có thể kéo cả hai phím ra & làm việc của bạn.

Theo quan điểm của bạn:

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") 

Trong js:

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

Tôi đã thử những gì bạn đề nghị, nhưng vấn đề là 'ques1' ở trên là một queryset, và json.dumps phàn nàn rằng không thể serialize queryset này. Trong thực tế, nó phàn nàn ngay cả khi bạn cố gắng tuần tự hóa chỉ đối tượng ('test1'). Ngoài ra, trong mã của tôi ở trên, hai điều tôi muốn gửi lại là biểu mẫu và đối tượng câu hỏi. –

+2

Vâng, bạn không thể JSON-serialize các đối tượng Python. Bạn không thể gửi 'đối tượng câu hỏi', mỗi lần; bạn chỉ có thể gửi một dict JSON của thuộc tính của đối tượng. Django có một [helper serialization được tích hợp sẵn] (https://docs.djangoproject.com/en/dev/topics/serialization/#serializing-data) có thể xử lý queryset. – AdamKG

3

Sử dụng JsonResponse

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