Django MultiWidget和字段标签

2024-06-16 11:49:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要一个Django表单,它包含3 forms.Textarea,压缩成一个models.TextField兼容的值。为此,我对forms.MultiValueFieldforms.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元素添加了labelattr,这让人感觉有点不舒服:

<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)

我担心的是,这使得代码更难维护,这表明我在这里遗漏了一些明显的东西。我的问题是是否有一个更一致的方法。你知道吗


Tags: nameidinit部件templateforms标签content