2011-12-29 102 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