2011-06-23 55 views
0

我試圖建立一個表,Django的是:填充的2D表逆向引用

  1. 採用的行和列之間的許多一對多的關係。
  2. 允許空白。
  3. 可擴展。
  4. 存儲可以使用行和列名稱檢索的值。我試圖使用中間模型來做到這一點(不知道這是否是最好的方式)。

我被卡住了引用的值。我的HTML表格需要列出所有可能的行和列,我不認爲我可以通過循環表值來實現,因爲有些可能不存在。

這裏是什麼,我試圖做一個例子...

models.py 
from django.db import models 

class Row(model.Models): 
    name = models.CharField(max_length=8) 

class Col(model.Models): 
    rows = ManyToManyField(Row, through='Table') 
    name = models.CharField(max_length=8) 

class Table(model.Models): 
    row = ForeignKey(Row) 
    col = ForeignKey(Col) 
    value = models.FloatField() 

的觀點:

views.py 
from django.shortcuts import * 
from test.app.models import * 

def table(request): 
    rows = Row.objects.all() 
    cols = Col.objects.all() 
    values = Table.objects.all() 
    return render_to_response(
     'app/table.html', 
     {'row_list': rows, 'col_list': cols, 'value_list': values} 
    ) 

HTML代碼(被卡住試圖訪問值):

table.html 
{% extends "base.html" %} 

{% block content %} 
    <h2>My Table</h2> 
    <ul> 
     <TABLE border=4 bgcolor=lightgray align=center> 
      <TR> 
       <TD align=center bgcolor=darkgray><strong></strong></TD> 

       {% for col in col_list %} 
       <TD align=center bgcolor=darkgray><strong>{{ col.name }}</strong></TD> 
       {% endfor %} 
      </TR> 

      {% for row in row_list %} 
      <TR> 
       <TD align=center bgcolor=darkgray><strong>{{ col.name }}</strong></TD> 

       {% for col in col_list %} 
       {% if row in col.rows.all %} 
       <!-- How can I access the table values here? --> 
       <TD align=left><input type="text" name="value" value="???" id="id_{{ col.id }}_{{ row.id }}" /></TD> 
       {% else %} 
       <TD align=left><input type="text" name="value" value="" id="{{col.id}}_{{row.id}}" /></TD> 
       {% endif %} 
       {% endfor %} 
      </TR> 
      {% endfor %} 
    </ul> 

{% endblock %} 

我最終想讓它更新值的形式,但現在我只需要讓我的html代碼工作。任何幫助,將不勝感激。

回答

0

你應該創建一個二維數組與你的價值觀:

col_lookup = dict([(col.id, i) for i, col in enumerate(cols)]) 

    row_lookup = dict([(row.id, i) for i, row in enumerate(rows)]) 

    # create an "empty" two dimensional array. 
    # each row is a tuple in the format (row, [False, False, False...]) 
    table = [(row, [False for x in xrange(len(col_lookup))]) for row in rows] 

    for cell in Table.objects.all(): 
     table[row_lookup[cell.row_id]][1][col_lookup[cell.col_id]] = cell.value 

現在呈現table。使用{%for row, values in table%} ... {{row.name}} ... {%for value in values%}

(我沒有測試的代碼建議:重命名Table模式Cell