【问题标题】:Use field label as placeholder in django-crispy-forms在 django-crispy-forms 中使用字段标签作为占位符
【发布时间】:2012-11-09 02:00:48
【问题描述】:

我正在考虑将字段标签用于我的<input> HTML 元素的占位符属性的 DRY 方式。我正在使用django-crispy-forms

现在我有:

class FilterForm(Form):

    query = CharField(max_length=50, label='', required=False)

    def __init__(self, data=None, files=None, **kwargs):
        self.helper = FormHelper()
        self.helper.layout = Layout(
            Field('query', placeholder='Search ...'),
        )
        super(FilterForm, self).__init__(data, files, **kwargs)

不过,我宁愿不必分别设置标签和占位符,因为这个 for 最终会有更多字段,而且非常冗长。

你有什么建议?

【问题讨论】:

  • 这对我来说并不干燥。这是两件不同的事情:将label 定义为空字符串,然后将placeholder 定义为文本。

标签: django twitter-bootstrap django-crispy-forms


【解决方案1】:

使用这种 __init__ 方法可以实现 DRY 解决方案:

def __init__(self, *args, **kwargs):
    super(FilterForm, self).__init__(*args, **kwargs)
    helper = self.helper = FormHelper()

    # Moving field labels into placeholders
    layout = helper.layout = Layout()
    for field_name, field in self.fields.items():
        layout.append(Field(field_name, placeholder=field.label))
    helper.form_show_labels = False

【讨论】:

  • 这是最好的解决方案。 @realefab 我必须使用self.helper = FormHelper(self) 而不是...= FormHelper()。适用于 Django 1.8.2 和 DCF 1.4.0。
【解决方案2】:

目前可以通过下面的bootstrap helper attribute来实现隐藏标签:

self.helper.form_show_labels = 假

默认设置为 True。它决定是否呈现表单的字段标签。

您仍然需要使用 Field 布局对象定义占位符:

Field('query', placeholder='Search ...'),

【讨论】:

    【解决方案3】:

    试试这个:

    class FilterForm(Form):
    
        query = CharField(max_length=50, label='', required=False)
    
        def __init__(self, data=None, files=None, **kwargs):
            self.helper = FormHelper()
            self.helper.layout = Layout(
                Field('query', placeholder=kwargs.pop('query_placeholder', 'random text')),
            )
            super(FilterForm, self).__init__(data, files, **kwargs)
    

    【讨论】:

      【解决方案4】:

      这种 DRY 解决方案不需要修改布局。我建议把它做成一个 mixin:

      class MyForm(Form):
      
          _placeholders = {
              'fieldname': 'fieldname placeholder',
          }
      
          def __init__(self, *args, **kwargs):
      
              # Assign placeholder to widget of fields
              # listed in self._placeholders.
              for field_name, field in self.fields.items():
                  if field_name in self._placeholders:
                      self.fields[field_name].widget.attrs['placeholder'] = \
                      self._placeholders[field_name]
      
              super(MyForm, self).__init__(*args, **kwargs)
      

      【讨论】:

      • 很好,因为它不依赖于 Crispy Forms。
      【解决方案5】:

      您可以使用以下方法向表单字段添加额外的属性:

      query = CharField(widget=forms.TextInput(attrs={'placeholder':'Search..'}),
                        max_length=50, label='', required=False)
      

      【讨论】:

      • @Centralniak:你在找这个吗?
      • 对不起,没有。我正在寻找明确的表格使用。干杯。
      【解决方案6】:

      如果您想要更多控制,可以使用小部件字段

      class PostForm(forms.ModelForm):
          class Meta:
              model = Post
              widgets = {
                  'comment': forms.Textarea(attrs={'rows': 6, 'placeholder': 'Enter your comments'}),
              }
              labels = {
                  "private": "Keep Private",
              }
              exclude = ['response', 'display']
      

      【讨论】:

        【解决方案7】:

        我最终只是使用 css 隐藏了字段标签。这有点hackish,但有效。我仍然使用 placeholder="your label" 来定义占位符。

        【讨论】:

          猜你喜欢
          • 2020-11-11
          • 2017-06-25
          • 2021-05-29
          • 2017-05-04
          • 1970-01-01
          • 2016-01-03
          • 1970-01-01
          • 2014-12-07
          • 2012-11-06
          相关资源
          最近更新 更多