Заполнение 2D таблицы с обратными ссылками - PullRequest
0 голосов
/ 24 июня 2011

Я пытаюсь построить таблицу с Django, которая:

  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-код работал. Любая помощь будет оценена.

1 Ответ

0 голосов
/ 24 июня 2011

Вы должны создать двумерный массив со своими значениями:

    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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...