python - 在 wagtail 的 draftail 中包含显示代码和引号的元素

标签 python wagtail draftjs

我刚刚开始了解鹡鸰。如何为我的 Wagtail 配置所有内置的 draftail 格式。 我需要添加 code 和 qoutes。

最佳答案

我认为如果您为此目的使用 StreamField 会更好,我已经这样做了(wagtail 1.13.1):

block .py

from django.utils.safestring import mark_safe
from django.utils.html import format_html

from pygments import highlight
from pygments.formatters import get_formatter_by_name
from pygments.lexers import get_lexer_by_name

from wagtail.wagtailcore import blocks


class CodeBlock(blocks.StructBlock):
    """
    Code Highlighting Block
    """
    LANGUAGE_CHOICES = (
        ('python', 'Python'),
        ('bash', 'Bash/Shell'),
        ('html', 'HTML'),
        ('css', 'CSS'),
        ('scss', 'SCSS'),
        ('json', 'JSON'),
        ('js', 'javaScript'),
        ('mysql', 'mysql'),
        ('jinja', 'jinja'),
        ('go', 'go')
    )

    STYLE_CHOICES = (
        ('default', 'default'),
        ('monokai', 'monokai'),
    )

    language = blocks.ChoiceBlock(choices=LANGUAGE_CHOICES)
    style = blocks.ChoiceBlock(choices=STYLE_CHOICES, default='default')
    code = blocks.TextBlock()

    class Meta:
        icon = 'code'

    def render(self, value, context=None):
        src = value['code'].strip('\n')
        lang = value['language']
        lexer = get_lexer_by_name(lang)
        css_classes = ['code', value['style']]

        formatter = get_formatter_by_name(
            'html',
            linenos='inline',
            cssclass=' '.join(css_classes),
            noclasses=False,
        )
        return mark_safe(highlight(src, lexer, formatter))


class BlockQuoteBlock(blocks.TextBlock):

    def render_basic(self, value, context=None):
        if value:
            return format_html(
                '<blockquote>{0}</blockquote>', mark_safe(value))
        else:
            return ''

    class Meta:
        icon = "openquote"

模型.py

from wagtail.wagtailcore.fields import StreamField
from .blocks import CodeBlock, BlockQuoteBlock
...

class BlogPage(Page):
    date = models.DateField("Post date")
    intro = RichTextField(blank=True)
    body = StreamField([
        ('heading', blocks.CharBlock(classname="full title")),
        ('paragraph', blocks.RichTextBlock()),
        ('code', CodeBlock()),
        ('blockquote', BlockQuoteBlock())
    ])

因为 this issue,我使用了自定义 BlockQuoteBlock .还要查看关于 StreamField 的文档:http://docs.wagtail.io/en/v2.0/topics/streamfield.html#

关于python - 在 wagtail 的 draftail 中包含显示代码和引号的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49206815/

相关文章:

python - 如何一次性获取列表中成员的最小值和最大值?

python - 如何通过 POST 请求向网站发送请求?

python - 保持azure管道作业中的postgres docker容器运行

Python 扩展在处理大型列表时创建无效指针

css - 带有填充底部的 wagtail hallojs 编辑器视频嵌入

wagtail - 如何使用 StaticLiveServerTestCase Suite 以编程方式设置 Wagtail 根页面以进行测试

python - 为什么 Heroku 在 Wagtail 中强制运行 dev.py?

javascript - 使 document.execCommand ('insertText' , false, 'message' ) 与 Draftjs 一起使用?

reactjs - 突变后失去选择

reactjs - 使用带有反应钩子(Hook)的 Draft js 提及插件