gpt4 book ai didi

wagtail - 如何更改 Wagtail 的表单生成器呈现的 <textarea> 中的行数

转载 作者:行者123 更新时间:2023-12-04 01:37:59 28 4
gpt4 key购买 nike

我使用 Wagtail 的表单构建器创建了一个表单,其中包含一个多行文本项。当 <textarea>元素被渲染,它用 rows="10" 渲染.我需要减少行数,但在文档中看不到有关如何执行此操作的任何内容。

最佳答案

快速解决方案

  • 创建一个从 wagtail.contrib.forms.forms 扩展 FormBuilder 的类
  • 在此 CustomFormBuilder 类中覆盖方法 create_multiline_field
  • 此方法应返回 Django Form Field
  • 默认使用的小部件是Textareadefault html attrs列数:40 行数:10
  • 在覆盖的方法中,传入您需要的任何自定义属性,例如attrs = {'cols': '20', 'rows': '20'}
  • 最后,确保您的 FormPageform_builder 设置为 CustomFormBuilder 类。
  • 下面的完整代码片段,这将使所有多行表单字段相同
from django.db import models
import django.forms

from modelcluster.fields import ParentalKey

from wagtail.contrib.forms.forms import FormBuilder
from wagtail.contrib.forms.models import AbstractEmailForm, AbstractFormField
from wagtail.admin.edit_handlers import FieldPanel, FieldRowPanel, InlinePanel, MultiFieldPanel


class FormField(AbstractFormField):
page = ParentalKey('FormPage', related_name='form_fields', on_delete=models.CASCADE)


class CustomFormBuilder(FormBuilder):

def create_multiline_field(self, field, options):
attrs = {'cols': '20', 'rows': '20'} # default attrs = {'cols': '40', 'rows': '10'}
return django.forms.CharField(widget=django.forms.Textarea(attrs=attrs), **options)


class FormPage(AbstractEmailForm):

form_builder = CustomFormBuilder # added - allows us to override the default FormBuilder

content_panels = AbstractEmailForm.content_panels + [
#... InlinePanel etc
]

更通用的解决方案

  • 在上面的代码的基础上,我们必须选择,使小部件属性可按字段或按页面自定义,所有这些都有其优点和缺点,但让每个表单字段都可以自定义自己的属性。
  • 下面我们向 FormField 添加了一个新的 StreamField,它允许我们添加任何可用作 HTML 属性的任意键/值对。
  • 表单页面编辑不会受到太大影响,因为新的 2.7 StreamField 设计非常小。
  • 然后,我们需要在覆盖的 create_multiline_field 方法中读取该字段的数据。
  • 注意:下面的示例仅将属性传递给多行字段,如果您想将属性传递给它们的每个小部件,则需要覆盖每个表单字段方法。
from django.db import models
import django.forms

from modelcluster.fields import ParentalKey

from wagtail.core import blocks
from wagtail.core.fields import StreamField
from wagtail.contrib.forms.forms import FormBuilder
from wagtail.contrib.forms.models import AbstractEmailForm, AbstractFormField
from wagtail.admin.edit_handlers import FieldPanel, FieldRowPanel, InlinePanel, MultiFieldPanel, StreamFieldPanel


class FormField(AbstractFormField):
attributes = StreamField([
('attributes', blocks.StructBlock([
('name', blocks.CharBlock()),
('value', blocks.CharBlock()),
])),
], blank=True)

page = ParentalKey('FormPage', related_name='form_fields', on_delete=models.CASCADE)

panels = AbstractFormField.panels + [
StreamFieldPanel('attributes'),
]


class CustomFormBuilder(FormBuilder):

def create_multiline_field(self, field, options):
# note - to accept attrs - ALL form field methods will need to be updated

attributes = field.attributes
attributes_data = attributes.get_prep_value() # convert the streamfield value into a Python data structure
# outputs [{'value': {'value': '5', 'name': 'rows'}, 'id': '6cb7d669-626c-47c0-bcac-5d982e5d9209', 'type': 'attributes'}]

keys = [_.get('value').get('name') for _ in attributes_data]
values = [_.get('value').get('value') for _ in attributes_data]
attrs = dict(zip(keys, values))
return django.forms.CharField(widget=django.forms.Textarea(attrs=attrs), **options)


class FormPage(AbstractEmailForm):

form_builder = CustomFormBuilder # added - allows us to override the default FormBuilder

content_panels = AbstractEmailForm.content_panels + [
#... InlinePanel etc
]

关于wagtail - 如何更改 Wagtail 的表单生成器呈现的 &lt;textarea&gt; 中的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58825233/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com