Использование 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 в том, что редакторы теперь могут размещать таблицу в любом месте страницы.