【问题标题】:How to customize the rendering of a form in Django?如何在 Django 中自定义表单的呈现?
【发布时间】:2014-11-07 20:56:22
【问题描述】:

由于这个原因,我已经有一段时间避免在 Django 中使用表单了,我觉得这可能是一种不好的做法。在 Django 中呈现表单时,一切都是自动化的。这会阻止您有条件地呈现或隐藏表单的某些部分,将不同的 css 类附加到该表单等。

以尽可能动态的方式使用 Django 表单的正确方法是什么?

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

    我的回答基于Rainy 的内容并参考thisthis,我的回答是

    sudo pip install django-widget-tweaks
    

    要在您的项目中启用 widget_tweaks,您需要将其添加到项目 settings.py 文件中的 INSTALLED_APPS:

    INSTALLED_APPS = [
        ...
        'widget_tweaks',
        ...
    ]
    

    我会将它包含在我要呈现的表单的所有模板文件的开头。

    {% load widget_tweaks %}
    

    并按如下方式呈现我的表单:

    <form method="post" action="">
      {% csrf_token %}
      {% for fld in form %}
        <div class="form-group">
          {% for error in fld.errors %}<p class="help-block text-danger">{{ error }}</p>{% endfor %}
          <label>{{ fld.label }}</label>
          {% render_field fld class+="form-control" %}
          <p class="help-block">{{ fld.help_text|safe }}</p>
        </div>
      {% endfor %}
      <button type="submit" class="btn btn-success">{% trans 'Submit' %}</button>
    </form>
    

    【讨论】:

      【解决方案2】:

      首先,绝对不要回避表格。事实上,总是在 django 中使用表单。它们使用简单,没有理由不使用。

      表单具有足够的灵活性,可以根据需要为您提供尽可能多的控制权。

      通常你会想做这样的事情:

      <form action="/myurl/" method="post">
          {% csrf_token %}
          {% for fld in form %}
              {{ fld.label }} {{ fld }} {{ fld.help_text }} {{ fld.error }}
          {% endfor %}
          <input type="submit" value="Submit" />
      </form>
      

      您可能还想将字段包装在 div 或表格中。您还可以测试 fld.name 以根据字段名称执行自定义操作。

      【讨论】:

      • 感谢您的回复。我可以看到你是如何以这种方式循环的......例如,我正在使用 django-allauth 来处理我的身份验证,它有一个开箱即用的登录表单。它将“电子邮件”输入呈现为&lt;input autofocus="autofocus" id="id_login" name="login" placeholder="E-mail address" type="email"&gt;,但我想将其呈现为&lt;input type="email" name="email_address" class="form-control" placeholder="Email Address"/&gt;,特别是使用该css 类和占位符值。您如何更改特定表单字段上的内容?
      【解决方案3】:

      我和你在同一条船上,吉姆,我目前正在查看https://docs.djangoproject.com/en/dev/ref/forms/widgets/。这似乎是自定义字段的一个很好的起点。

      至于有条件地显示/隐藏元素,如果您希望在表单加载时完成此操作(即,预先确定的表单布局,您可以按照这个 SO answer 解释对表单的 init 的更改:Conditionally show and hide a form field and set the field value

      或者,如果您的意思是如何在表单完成时根据其他选择在上下文中执行此操作,那么到目前为止我发现的唯一方法是使用表单呈现的模板加载一些自定义 jQuery在。如果有办法做到这一点,我也想知道:)

      【讨论】:

        猜你喜欢
        • 2015-08-13
        • 2012-12-04
        • 2012-03-31
        • 2018-08-31
        • 2013-05-04
        • 1970-01-01
        • 2016-08-16
        • 1970-01-01
        • 2019-09-08
        相关资源
        最近更新 更多