2012-01-29 89 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) 
相關問題