Задать вопрос
@Dbtzhv

Django-templates+JS: как в скрипте создать ещё один блок?

Использую django с channels для работы с вебсокетами. Всё сделал, кроме динамического отображения блоков в timeline-panel. Вот пример:
6501620bcad04614299496.png

Вот мой скрипт для подключения к сокетам и смены расы, в соответствие с выбранной (но тут просто меняем старый текст, на новый):

<script language="javascript">
    var ws_url = 'ws://' + window.location.host + '/ws/race/';
    var raceSocket = new WebSocket(ws_url);

    raceSocket.onmessage = function(event) {
        var data = JSON.parse(event.data);
        var playerRaceElement = document.querySelector(`[data-player-id="${data.playerId}"]`);
        if (playerRaceElement) {
            playerRaceElement.textContent = data.race;
        }
    };

</script>


Теперь я хочу в этот же скрипт добавить код для добавления нового элемента в таймлайн-панель.

Что нужно добавить в этот код, чтобы добавить один элемент в:
{% if True %}
<div class="container" id="timeline-block">
    <div class="row">
        <div class="panel-timeline">
            {% with player_items=room|get_room_levels %}
                {% for item in player_items|dictsort:"create" reversed %}
                    {% if item|get_item_type == 'PlayerLeavel' %}
                        <div class="timeline">
                                        <div class="timeline-content">
                                            <span class="date">
                                                <span class="month">{{ item.create.time }}</span>
                                                <span class="year">{{ item.create.date|date:"d.m"  }}</span>
                                            </span>
                                            <h2 class="title" style="background: #02a2dd;"><span class="fa fa-chevron-up" aria-hidden="true"></span> {{ item.player.player.email }} теперь {{ item.leavel }} уровня
                                            </h2>
                                            <p class="description">Игрок {{ item.player.player.email }} изменил уровень </p>
                                        </div>
                                    </div>
                    {% elif item|get_item_type == 'PlayerPower' %}
                        <div class="timeline">
                                        <div class="timeline-content">
                                            <span class="date">
                                                <span class="month">{{ item.create.time }}</span>
                                                <span class="year">{{ item.create.date|date:"d.m"  }}</span>
                                            </span>
                                            <h2 class="title" style="background: #9f84c4;"><span class="fa fa-chevron-up" aria-hidden="true"></span> {{ item.player.player.email }} теперь {{ item.power }} мощности
                                            </h2>
                                            <p class="description">Игрок {{ item.player.player.email }} изменил мощность</p>
                                        </div>
                                    </div>
                    {% elif item|get_item_type == 'PlayerClass' %}
                        <div class="timeline">
                                        <div class="timeline-content">
                                            <span class="date">
                                                <span class="month">{{ item.create.time }}</span>
                                                <span class="year">{{ item.create.date|date:"d.m"  }}</span>
                                            </span>
                                            <h2 class="title" style="background: #58b25e;"><span class="fa fa-chevron-up" aria-hidden="true"></span> {{ item.player.player.email }} теперь класса {{ item.get_value_display }}
                                            </h2>
                                            <p class="description">Игрок {{ item.player.player.email }} изменил класс</p>
                                        </div>
                                    </div>
                    {% elif item|get_item_type == 'PlayerRace' %}
                        <div class="timeline">
                                        <div class="timeline-content">
                                            <span class="date">
                                                <span class="month">{{ item.create.time }}</span>
                                                <span class="year">{{ item.create.date|date:"d.m"  }}</span>
                                            </span>
                                            <h2 class="title" style="background: #eab715;"><span class="fa fa-chevron-up" aria-hidden="true"></span> {{ item.player.player.email }} теперь расы {{ item.get_value_display }}
                                            </h2>
                                            <p class="description">Игрок {{ item.player.player.email }} изменил расу</p>
                                        </div>
                                    </div>
                    {% endif %}
                {% endfor %}
            {% endwith %}

        </div>
    </div>
</div>
{% endif %}


а конкретно, в данном случае:
<div class="timeline">
                                        <div class="timeline-content">
                                            <span class="date">
                                                <span class="month">{{ item.create.time }}</span>
                                                <span class="year">{{ item.create.date|date:"d.m"  }}</span>
                                            </span>
                                            <h2 class="title" style="background: #eab715;"><span class="fa fa-chevron-up" aria-hidden="true"></span> {{ item.player.player.email }} теперь расы {{ item.get_value_display }}
                                            </h2>
                                            <p class="description">Игрок {{ item.player.player.email }} изменил расу</p>
                                        </div>
                                    </div>


На теги можно не обращать внимание, можно с заглушками просто сделать. Главное, чтоб новый элемент в том месте появился

P.S. ChatGPT'шное решение не работает:
<script language="javascript">
    var ws_url = 'ws://' + window.location.host + '/ws/race/';
    var raceSocket = new WebSocket(ws_url);

    raceSocket.onmessage = function(event) {
        var data = JSON.parse(event.data);

        // Создаем новый блок таймлайна
        var newTimelineBlock = document.createElement('div');
        newTimelineBlock.classList.add('timeline');

        var newTimelineContent = document.createElement('div');
        newTimelineContent.classList.add('timeline-content');

        var dateElement = document.createElement('span');
        dateElement.classList.add('date');

        var monthElement = document.createElement('span');
        monthElement.classList.add('month');
        monthElement.textContent = data.create.time;

        var yearElement = document.createElement('span');
        yearElement.classList.add('year');
        yearElement.textContent = data.create.date;

        dateElement.appendChild(monthElement);
        dateElement.appendChild(yearElement);

        var titleElement = document.createElement('h2');
        titleElement.classList.add('title');
        titleElement.style.background = '#eab715';
        titleElement.innerHTML = '<span class="fa fa-chevron-up" aria-hidden="true"></span> ' + data.playerId + ' теперь расы ' + data.race;

        var descriptionElement = document.createElement('p');
        descriptionElement.classList.add('description');
        descriptionElement.textContent = 'Игрок ' + data.playerId + ' изменил расу';

        newTimelineContent.appendChild(dateElement);
        newTimelineContent.appendChild(titleElement);
        newTimelineContent.appendChild(descriptionElement);

        newTimelineBlock.appendChild(newTimelineContent);

        // Добавляем новый блок таймлайна к контейнеру таймлайнов
        var timelineContainer = document.getElementById('timeline-block');
        timelineContainer.appendChild(newTimelineBlock);
    };

</script>
  • Вопрос задан
  • 116 просмотров
Подписаться 1 Средний 4 комментария
Пригласить эксперта
Ваш ответ на вопрос

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

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