@Kopta

Как правильно заполнить таблицу данными в Django Template по столбцам?

models.py:
from django.db import models

class Server(models.Model):
    name = models.CharField(max_length=16)
    url = models.CharField(max_length=64)

class Team(models.Model):
    server = models.ForeignKey(Server, on_delete=models.CASCADE)
    name = models.CharField(max_length=16)
    n_players = models.IntegerField(null=True)

class Player(models.Model):
    server = models.ForeignKey(Server, on_delete=models.CASCADE)
    team = models.ForeignKey(Team, on_delete=models.CASCADE)
    name = models.CharField(max_length=16, null=True)
    highlight = models.BooleanField(default=False)


views.py:
from django.shortcuts import render
from .models import Server, Team

def index(request):
    server_list = Server.objects.order_by('name')[:3]
    context = {'server_list': server_list}

    return render(request, 'monitor/index.html', context)


templates index.html:
{% for server in server_list %}
    <h2>{{ server.name }}</h2>
    <table>

        <tr>
        {% for team in server.team_set.all %}
            <th>
                <b>{{ team }}</b>
            </th>
        {% endfor %}
        </tr>

        {% for team in server.team_set.all %}
            <tr>
                {% for player in team.player_set.all %}
                                    
                    <td>{{ player }}</td>
                                    
                {% endfor %}
            </tr>
        {% endfor %}
        
    </table>    
{% endfor %}


Вопрос в том, как сделать так (не меняя модель данных), чтобы Игроки одной команды распределялись правильно в одном столбце по командам, а не в строчку как сейчас.
5da48ff5609c3882266870.png
  • Вопрос задан
  • 598 просмотров
Пригласить эксперта
Ответы на вопрос 2
@szelga
самый быстрый способ: вывести каждую команду в строку, а затем транспонировать таблицу https://stackoverflow.com/a/40213981
можно вместо этого в представлении рассовать игроков по спискам.
Ответ написан
Комментировать
@Kopta Автор вопроса
Попробовал переделать набор в список в views.py. Но как-то толком не вышло.
На текущий момент решил по-другому.
В views.py добавил
context['range_1_7'] = range(1, 7)
Это позволяет пройти по циклу в шаблоне 6 раз (т.к. максимум 6 игроков в каждой команде).
И вывод по строкам/столбцам теперь такой (templates):

{% for row in range_1_7 %}
				<tr>
					{% for team in server.team_set.all %}
						{% with team.player_set.all as player_list %}
							<td>
								{% if row == 1 %}
									{{ player_list.0.name }}
								{% elif row == 2 %}
									{{ player_list.1.name }}
								{% elif row == 3 %}
									{{ player_list.2.name }}
								{% elif row == 4 %}
									{{ player_list.3.name }}
								{% elif row == 5 %}
									{{ player_list.4.name }}
								{% elif row == 6 %}
									{{ player_list.5.name }}
								{% endif %}
							</td>
						{% endwith %}
					{% endfor %}
				</tr>
{% endfor %}

Конечно, наверное это совсем не красивое решение, но работает.
Еще бы разобраться как можно сделать что-то вроде переменной в переменной:
{{ player_list.{{ row-1 }}.name }}
Тогда и уйдет многоэтажный IF.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы