2012-02-09 71 views
5

我有一個定義如下所示的模型,它對查詢起作用並獲取必須放置在表格的適當單元格中的對象列表。這是代碼的相關部分。如何將QuerySet呈現爲表格模板-javascript,jquery,django,

class Location(models.Model): 
    x=models.IntegerField(null=True) 
    y=models.IntegerField(null=True) 
    z=models.CharField(max_length=5,null=True) 

    def __unicode__(self): 
     return self.z 

從這分貝我想檢索所有的對象並將其放置在一個二維表的行和由X定義的列中,使y object.If存在用於特定(X,Y)沒有對象然後該表格中的特定插槽應顯示爲空。這是我爲滿足這些目的而寫的觀點。

def gettable(request): 
    events=[] 
    for xdim in xrange(3): 
     xe=[] 
     for ydim in xrange(3): 
      object=[0] 
      object.append(Location.objects.filter(x=xdim,y=ydim)) 
      xe.append(object[-1]) 
      events.append(xe) 
    return render(request, 'scheduler/table.html', {'events':events}) 

下面是代碼

<table border="1"> 
    <th>Header 0</th> 
    <th>Header 1</th> 
    <th>Header 2</th> 
    {% for event in events %} 
    <tr> 
    {% for x in event %} <td>{{ x }}</td> 
    {% endfor %} 
    </tr> 
    {% endfor %} 
</table> 

我要在這裏解決多個問題的HTML部分。

1.我的代碼視圖並不高雅(這是不好的,因爲我知道django提供了很多東西來處理這些任務),因爲我定義了專門用於循環的變量,而不是從(x, y)數據庫對象的值。

2.我得到[<Location: 21>]格式的輸出,但我希望它是'21'。

3.如何在給定(x,y)不存在任何對象的情況下引入空單元格。

4.請提出任何其他可能使我的代碼更簡單和一般的方式。

回答

14

如果你想讓你的代碼更簡單,我想推薦使用應用程序django-tables2。這種方法可以解決您關於生成表的所有問題。

由於文檔賽斯:

Django的tables2簡化轉彎組數據轉換成HTML 表的任務。它具有對分頁和排序的本機支持。它爲 HTML表格提供了django.forms爲HTML表單所做的工作。例如

它的特點包括:

  • 任何迭代可以是一個數據源,但包括用於Django的查詢集的特殊支持。
  • 內置用戶界面不依賴於JavaScript。
  • 用於自動生成這些表支持基於一個Django模型。
  • 通過子類,支持自定義列功能。
  • 分頁。
  • 基於列的表的排序。
  • 模板標籤,使平凡的渲染HTML。
  • 用於在Django 1.3使用通用視圖混入。

創建表格很簡單,只要:

import django_tables2 as tables 

class SimpleTable(tables.Table): 
    class Meta: 
     model = Simple 

這然後將在視圖中使用:

def simple_list(request): 
    queryset = Simple.objects.all() 
    table = SimpleTable(queryset) 
    return render_to_response("simple_list.html", {"table": table}, 
           context_instance=RequestContext(request)) 

最後在模板:

{% load django_tables2 %} 
{% render_table table %} 

這個例子顯示了 最簡單的情況之一,但是d jango-tables2可以做更多!查看 瞭解更多詳情documentation

也可以使用字典代替queryset。

1

每點:

  1. IMO你可以逃脫創建自定義過濾器或標籤,並使用查詢集。
  2. 您需要定義一個__unicode__(或__string__)方法才能返回所需的項目。
  3. 如果該值爲空或該項不存在,則渲染結果也將爲空。

HTH

1

對於第2點,你給每一個小區的列表,而不是一個單一的對象,{{X.0}}應該給你正確的價值,但它也表明你在您的視圖邏輯中接近它錯誤。