我使用 Wagtail 的表单生成器创建了一个表单,其中包含多行文本项。当<textarea>元素被渲染时,它会使用 进行渲染rows="10"。我需要减少行数,但在文档中没有看到有关如何执行此操作的任何内容。
FormBuilder自的类wagtail.contrib.forms.formsCustomFormBuilder类中重写方法create_multiline_fieldTextarea,默认的 htmlattrs是 cols: 40 & rows: 10attrs = {'cols': '20', 'rows': '20'}FormPage有一套。form_builderCustomFormBuilderfrom 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
]
Run Code Online (Sandbox Code Playgroud)
StreamField功能FormField,让我们可以添加任何可以用作 HTML 属性的任意键/值对。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
]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
781 次 |
| 最近记录: |