2011-12-29 101 views
0

我創造,我認爲一個對象(與another site幫助):Django的模板解析

def myfavorites(request): 

    queryset = Favorite.objects.favorites_for_user(user=request.user).select_related('content_type', 'content_object') 

    generics = {} 
    for item in queryset: 
     generics.setdefault(item.content_type_id, set()).add(item.object_id) 

     content_types = ContentType.objects.in_bulk(generics.keys()) 

     relations = {} 
     for ct, fk_list in generics.items(): 
      ct_model = content_types[ct].model_class() 
      relations[ct] = ct_model.objects.in_bulk(list(fk_list)) 

     for item in queryset: 
      setattr(item, '_content_object_cache', 
       relations[item.content_type.id][item.object_id]) 

     return render_to_response('myfavorites.html', { 
      'favorites':relations 
     }, 
     context_instance=RequestContext(request)) 

這將對象傳遞給我的模板,上面寫着:

{8L: {33L: <Author: Poe>}, 21L: {32L: <Book: The Great Gatsby>, 7L: <Book: Great Expectations>}, 22L: {7L: <Quote: Hamlet>}} 

其中8我的作者表21的ID是我的Book表的ID,22是我的Quote表的ID。

我想列出對象,它讀取:

作者

書籍
了不起的蓋茨比
遠大前程

報價
哈姆雷特

我將如何解析在Django模板此對象嗎?

+0

您可以在視圖中轉換對象,還是必須是純模板解決方案?編輯爲 – SingleNegationElimination 2011-12-29 19:55:14

+0

以顯示原始視圖。任何協助轉換視圖? – 2011-12-29 20:00:32

+0

在我的迴應的底部,它說你應該能夠解析視圖中的對象(關係),並將它們分開發送給模板。這可以在render_to_response調用中完成,例如:'return render_to_response('myfavorites.html',{ 'authors':relations [8],'books':relations [21],'quotes':relations [22] } ,'你必須確認8L可以使用8,你可能需要在返回的關係[8/21/22]部分以某種方式轉換爲8L 21L和22L。 – Furbeenator 2011-12-29 20:16:09

回答

0

我想傳遞一個更像以下結構的上下文:

然後,你可以很容易地做這樣的事情:

<h1>Authors</h1> 
{% for author in authors %}{{ author }}{% endfor %} 

<h1>Books</h1> 
{% for book in books %}{{ book }}{% endfor %} 

<h1>Quotes</h1> 
{% for quote in quotes %}{{ quote }}{% endfor %} 
+0

編輯的問題顯示原始視圖。轉換視圖的任何幫助? – 2011-12-29 20:00:58

0

發送詞典到模板分開。發送一個作者字典,一本圖書字典和一個行情字典。然後你可以分別解析每一個。將以下字段a.name替換爲作者模型的名稱字段b.name與本書的名稱字段,並將q.quote替換爲引號的字符串字段。像這樣:

<div class="title">Authors</div> 
{% for a in Authors %} 
    <div>{{ a.name }}</div> 
{% endfor %} 

<div class="title">Books</div> 
{% for b in Bookss %} 
    <div>{{ b.name }}</div> 
{% endfor %} 

<div class="title">Quotes</div> 
{% for q in Quotes %} 
    <div>{{ q.quote }}</div> 
{% endfor %} 

如果你沒有個人數據的控制權,你可以分析對象在視圖中傳遞到模板:

Authors = object['8L'] # Not positive about the Long, may need to convert. 
Books = object['21L'] # Not positive about the Long, may need to convert. 
Quotes = object['22L'] # Not positive about the Long, may need to convert. 

返回那些變量的模板。

+0

編輯我的問題以顯示原始視圖。優先次序是沒有觸及數據庫3次,每個表格有一次。轉換視圖的任何幫助? – 2011-12-29 20:02:12

+1

是否確定只觸擊數據庫是一次嗎?'content_type's通常是異構的,分佈在多個表中;查看查詢中表示的每種類型的選擇是很正常的。查詢日誌中生成的SQL是什麼? – SingleNegationElimination 2011-12-29 21:07:15

+0

你是對的,它沒有做我認爲的事。任何有關如何限制SQL查詢數量的建議? – 2011-12-30 21:28:09