Использование Wagtail с блоком contrib_Table_block, похоже, работает не так, как с другими полями.

Я следил за ссылкой в документации по wagtail на настройку Table_block contrib. Предлагается сделать вставку в StreamField, что отлично работает для всех типов блоков и полей, кроме TableBlock(). При использовании Table_block либо через документацию, либо при вставке в уже работающий учебник, он не подключается к данным базы данных. Другими словами, большинство моих страниц будут заполняться из полей базы данных в таблицы. Поэтому использование блоков Table_Block() или TypedTableBlock() имеет наибольший смысл. Когда я делаю это, я получаю информацию о настройках таблицы, а не данные в ней. Я взял простой учебник по Streamfield и вставил TableBlock() в качестве вставки в StreamField, как и предлагалось в ссылке. Вот мой код: `

from django.db import models
from wagtail import blocks
from wagtail.models import Page
from wagtail.search import index
from wagtail.fields import StreamField
from wagtail.admin.panels import FieldPanel

from wagtail.contrib.table_block.blocks import TableBlock


class ScriptsPage(Page):

    template = 'scripts/scripts.html'

    script_content = StreamField([
        ('paragraph', models.Scripts()),
    ],
    )

    content_panels = Page.content_panels + [
        FieldPanel('script_content'),
    ]


class Scripts(TableBlock):
    table = (
        [
            # ('script_select', blocks.CharBlock(max_length=20)),
            ('script_name', blocks.CharBlock(max_length=20)),
            ('script_desc', blocks.CharBlock(max_length=200)),
            # body = blocks.RichTextBlock(blank=True, name="body")
            ('script_path',  blocks.CharBlock(max_length=20)),
            ('script_file', blocks.CharBlock(max_length=20)),
            ('script_args', blocks.CharBlock(max_length=100)),
            ('script_output_json', blocks.CharBlock(max_length=200)),
            ('script_on_demand', blocks.CharBlock(max_length=50)),
            ('script_sched_name', blocks.CharBlock(max_length=50)),
            ('script_send_output', blocks.CharBlock(max_length=50)),
            ('script_out_emails', blocks.CharBlock(max_length=50)),
        ]
    )

`

The template code is simply:
{% load i18n wagtailcore_tags %}
{% load static %}
<div>
    <table id="fresh-table" class="table">
        <thead>
        </thead>
        <tbody>
        <tbody>
          {% include_block scripts_content %}
        </tbody>
    </table>
</div>

Django 5.x, wagtail 6.x, использование python 3.12 в venv.

На странице администратора при редактировании появляется пустая таблица. Этот контент - база знаний об активно используемых скриптах и о том, что они делают. Все эти страницы - статьи KB, использующие таблицы одинаковым образом. На выходе я получаю следующее:

Сценарии таблица {'cell': [], 'data': [[None, None, None], [None, None, None], [None, None, None]], 'mergeCells': [], 'table_caption': 'Внешняя настройка скрипта:', 'first_col_is_header': False, 'table_header_choice': 'row', 'first_row_is_table_header': True}

Очевидно, что это совсем не то, чего я ожидал. Я ожидал увидеть таблицу со списком активных строк в БД и возможность вставить кнопку редактирования в какой-то момент, чтобы отредактировать данные. Очевидно, что TableBlock отличается, но, похоже, нет документации о том, КАК он отличается, и я пытался связать его с моделью 10 различными способами, но безуспешно. Я всегда получаю один и тот же результат. Другие, вероятно, легко поймут это, но я новичок в wagtail. Не новичок в Django в целом, но я впервые использую wagtail, потому что я хочу, чтобы KB был чем-то, куда люди могут легко добавлять страницы и данные.

Спасибо всем!

Я попробовал сделать прямую модель для одной вещи, используя:

class ScriptsTable(models.Model): Затем определяем каждое поле и добавляем его в поле потока таким же образом, как описано выше. При этом вывод не изменяется.

Я также попробовал итерировать данные таблицы в шаблоне, думая, что это может быть не полностью автоматизированное поле, как другие. В основном это выглядит так:

        <tbody>
          {% include_block scripts_content %}
          {% for i in scripts_content.table %}
            <tr>
              {% for f in i.scripts_content.table %}
                <td></td>
              {% endfor %}
              </tr>
          {% endfor %}
            <tr class="active-row">
            </tr>
        </tbody>

Я также пробовал подставлять вместо него StructBlock, думая, что это проблема интеграции с StreamField. Странно то, что ничто из того, что я пробовал, не изменило вывод или тот факт, что makemigrations не распознает новые поля, что указывает на то, что он даже не распознает, что таблица подключена к живым данным.

Я не думаю, что TableBlock или TypedTableBlock - это то, что вы ищете. Оба они предназначены для того, чтобы позволить редакторам создавать таблицы путем ввода в интерфейс администратора. Оба этих блока хранят свои данные в JSON для соответствующего StreamField.

большинство моих страниц будут заполняться из полей базы данных в таблицы

Если это ваша цель, вам следует извлечь данные из базы данных в методе get_context и использовать пользовательский шаблон для отображения данных. Вы можете сделать это прямо на странице, как показано в примере в учебнике. Или вы можете создать StructBlock, который будет выполнять запрос к базе данных и указывать пользовательский шаблон для отображения информации. Преимущество StructBlock в том, что редакторы теперь могут размещать таблицу в любом месте страницы.

Вернуться на верх