我需要一个Django表单,它包含3 forms.Textarea
,压缩成一个models.TextField
兼容的值。为此,我对forms.MultiValueField
和forms.MultiWidget
都进行了子类化。我的问题是如何识别在哪里以及如何向小部件的textarea
输入添加标签。你知道吗
我目前正在做的是将标签值作为attr
传递给小部件的子小部件:
class ContentWidget(forms.MultiWidget):
template_name = 'content_widget.html'
def __init__(self, attrs=None):
widgets = (
forms.Textarea({'label': 'A'}),
forms.Textarea({'label': 'B'}),
forms.Textarea({'label': 'C'}),
)
super().__init__(widgets, attrs)
这让我保持content_widget.html
相当简洁:
{% for subwidget in widget.subwidgets %}
<label for="{{ subwidget.attrs.id }}">{{ subwidget.attrs.label }}</label>
{% include subwidget.template_name with widget=subwidget %}
<br />
{% endfor %}
但这也为每个html元素添加了label
attr,这让人感觉有点不舒服:
<textarea name="content_0" cols="40" rows="10" label="A" required="" id="id_content_0"></textarea>
另一种选择是在模板的较长版本中显式包含它:
<label for="{{ widget.subwidgets.0.attrs.id }}">A</label>
{% include widget.subwidgets.0.template_name with widget=subwidget %}
...
但是,对于一般的表单元素,标签被分配给字段,但是如果在那里定义它们,我就找不到让小部件从MultiValueField
实例访问它们的方法:
class ContentField(forms.MultiValueField):
def __init__(self, **kwargs):
fields = (
forms.CharField(label="A"),
forms.CharField(label="B"),
forms.CharField(label="C"),
)
super().__init__(fields, require_all_fields=False, **kwargs)
我担心的是,这使得代码更难维护,这表明我在这里遗漏了一些明显的东西。我的问题是是否有一个更一致的方法。你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐