【问题标题】:Get the type of field in django template获取django模板中的字段类型
【发布时间】:2015-10-12 16:59:39
【问题描述】:

我正在使用 django 表单,我想在我的 html 中使用 Twitter Bootstrap 的 css。 所以我的模板看起来像这样:

{% for field in form %}
    <div class="form-group">
        {{ field.label_tag }}<!--Same thing as : <label for="{{field.id_for_label}}"></label> -->

        <input type="{{field.type}}" class="form-control" id="{{field.auto_id}}" placeholder="Email">
      </div>
{% endfor %}

我无法弄清楚获取类型值。 {{field.type}}

有没有办法获取django模板中输入字段的类型?

提前致谢

更新: 我问这个问题的原因是因为我希望能够将引导类应用于输入元素。但在 Bootstrap3 中,要使用默认 css 作为输入类型,您必须向输入元素添加表单控制类,如下所示:&lt;input type="text" class="form-control" id="{{field.auto_id}}" placeholder=""&gt;.

如果我使用 django 的字段 {{field}} 那么我无法添加表单控制类。 我希望这能澄清一些事情。

我还看到了这个应用程序https://github.com/dyve/django-bootstrap3,它看起来就像我想做的那样。令我惊讶的是,django 不允许访问表单类型以提供更大的灵活性。

【问题讨论】:

  • 通常,您只需执行以下操作:&lt;div class="form-group"&gt; {{ field }} &lt;/div&gt; 该类型将由 Django 自动填写。您是否需要该类型用于其他目的?
  • @AnthonyHilyard 是的。但在 Bootstrap3 中,要将默认 css 用于输入类型,您必须将表单控制类添加到输入元素,如下所示:&lt;input type="text" class="form-control" id="{{field.auto_id}}" placeholder=""&gt; 我真正想做的是在模板本身中应用表单控制类。

标签: django django-forms


【解决方案1】:

根据https://stackoverflow.com/a/31538555/254553

你可以使用:

{{ [FIELD].field.widget.input_type }}

[FIELD] 是您的字段名称。

【讨论】:

  • 这应该是一个可以接受的答案!
【解决方案2】:

您可以覆盖表单的__init__ 方法,以便将属性传递给HTML,而无需知道字段的类型。适用于标准表单和模型表单

class CoolForm(forms.Form):
    field_name = forms.CharField(...)

    def __init__(self, *args, **kwargs):
        super(CoolForm, self).__init__(*args, **kwargs)
        self.fields['field_name'].widget.attrs = {
            'class': 'form-control'
        }

您可以通过这种方式将任何 HTML 属性传递给模板,例如 'placeholder': 'email@exam.pl'

【讨论】:

    【解决方案3】:

    我也有这个问题。我使用 Django Widget Tweaks 添加类 (https://github.com/kmike/django-widget-tweaks)。

    然后你可以这样做:

        {% for field in form %}
         <div class="form-group {% if field.errors %}has-error {% endif %}">    
            {% render_field field class="form-control" %}
            {% if field.errors %}
            <span class="help-block">{{ field.errors.0 }}</span>
            {% endif %}
        </div>
       {% endfor %}
    

    我认为另一种处理方法是使用 django 脆形式,但我还没有尝试过。

    【讨论】:

      【解决方案4】:

      我认为您不必担心field_type。 Django 将根据表单字段自行为您处理。

      假设我们有一个ContactForm 喜欢:

      class ContactForm(forms.Form):
          subject = forms.CharField(max_length=100)
          message = forms.CharField(widget=forms.Textarea)
          sender = forms.EmailField()
          cc_myself = forms.BooleanField(required=False)
      

      那么{{form.subject}}会自动在模板中创建&lt;input&gt;元素。

      <input id="id_subject" type="text" name="subject" maxlength="100" />
      

      同样,模板中的{{form.message}} 会创建:

      <input type="text" name="message" id="id_message" />
      

      虽然如果你真的需要在模板中获取表单字段类型,你可以创建一个自定义模板过滤器,如下所示。

      from django import template
      
      register = template.Library()
      
      @register.filter(name='field_type')
      def field_type(field):
          return field.field.widget.__class__.__name__
      

      现在,在您的模板中,您需要执行以下操作:

      {{form.field_name|field_type}}
      

      在上面的例子中,{{form.message|field_type}} 将返回TextInput

      【讨论】:

      • 真的!不过,我希望输入元素具有更大的灵活性。主要是为了能够在模板本身中使用引导类。
      • 使用自定义模板过滤器更新了 ans,该过滤器将返回 field_type。
      【解决方案5】:

      如果您想访问字段类型,请参考this answer
      如果要覆盖字段的默认类型,请在为字段定义小部件时使用attrs 参数。
      例如。

      field_name = forms.CharField(widget=forms.Textarea(attrs={'type': 'custom type'}))
      

      另外请注意,您可以将任何键值对传递给attrs,它们将在呈现表单时用作html标签中的属性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-07
        • 2023-03-26
        • 2020-06-30
        • 1970-01-01
        • 2011-04-08
        • 2017-11-11
        • 2011-03-10
        • 2011-11-18
        相关资源
        最近更新 更多