如何将 Django forms.ChoiceField 呈现为 Twitter Bootstrap 下拉菜单
Posted
技术标签:
【中文标题】如何将 Django forms.ChoiceField 呈现为 Twitter Bootstrap 下拉菜单【英文标题】:How to render Django forms.ChoiceField as Twitter Bootstrap dropdown 【发布时间】:2012-07-29 19:04:54 【问题描述】:使用 django-bootstrap、django-bootstrap-form、django-bootstrap- 之一呈现 Django forms.ChoiceField 作为 Twitter Bootstrap 下拉列表的最有效方法是什么(在编程/维护工作、优雅方面)工具包、django-crispy-forms 等应用程序?这些应用程序中是否明确支持此用例?
【问题讨论】:
【参考方案1】:免责声明我是 django-crispy-forms(提到的应用之一)的首席开发人员。
我将尝试解释您如何使用 django-crispy-forms 执行此操作。您只需在模板中执行:
% load crispy_forms_tags %
form|crispy
您可以在django-crispy-forms docs 中看到这一点以及更多内容。您的 ChoiceField 将根据需要呈现为 Bootstrap 下拉菜单。
与 django-bootstrap 相比
首先,有一点历史。 django-bootstrap 诞生于 django-uni-form(django-crispy-forms 的父项目)之后。那时,django-uni-form 已经在做 Boostrap 表单,但可能不是最好的方式(Bootstrap 是通过使用附加的 contrib 应用程序来支持的)。因此,django-bootstrap 的作者可能决定自己去。
现在,关于 Bootstrap 支持。 django-bootstrap 也可以呈现表单,但它不是使用 Django 过滤器,而是更改表单的基类。所以 django-crispy-forms 会影响你的模板,而 django-bootstrap 会影响你的 Python 代码。
此外,django-crispy-forms 和 django-bootstrap 都可以让您进行布局。在 django-bootstrap 中,布局位于表单内的 Meta 类中,而在 django-crispy-forms 中,布局位于 FormHelper
的子类中,这可以让您解耦。
django-bootstrap 使用元组来定义布局,而crispy-forms 使用Layout
的子类。这增加了重用布局、轻松组合布局等的可能性。请注意,虽然crispy 的封装内部仍然有一个字段列表,但它添加了一个有用且人性化的 API 来以编程方式操作布局,我认为它强制执行了一个很好的解耦模式。
据我所知,crispy-forms 的布局更强大。它有一个更大的布局对象集合,例如,前置文本、附加文本、日期范围等已经被支持,而在 django-boostrap 中这些都在 TODO 列表中。
crispy-forms 还有一个 API,用于在旅途中修改布局并进行一些非常好的程序化布局构建。
crispy-forms 还支持各种形式的表单集。它支持不同的 CSS 模板包,这意味着如果将来新的 kicking CSS 包命名为“巧克力”,为它创建一个新的模板包将非常容易,并且您的所有表单都可以使用 ' Chocolate' 无需更改代码,只是一个简单的设置变量。
crispy-forms 还具有 attributes 您可以在 FormHelper
中设置,它定义了您可以轻松打开和关闭的不错的额外功能。如果需要,您还可以创建自己的自定义属性。
最后,django-crispy-forms(连同 django-uni-form)有超过 67.000 次下载,这对于 Django 应用程序来说是相当不错的。该项目在 Github 上拥有近 500 名粉丝、几个大用户、良好的测试覆盖率和几年的历史,并且仍在积极维护中。
与 django-bootstrap-form 相比
据我所知,django-bootstrap-form 只是一个用于使用 Bootstrap 呈现表单的过滤器。这是 django-crispy-form 涵盖的内容,同时提供了更多。该项目于 2012 年 8 月 21 日发布,在我看来就像是在重新发明***,因为其他几个应用程序已经涵盖了这个用例。
与 django-bootstrap-toolkit 相比
它的灵感来自 django-boostrap-form。从我在文档中看到的内容来看,它还为您提供了一个过滤器,用于使用 Bootstrap 呈现表单。它显然涵盖了比表单更多的 Bootstrap 内容,但我在其文档中找不到更多信息。上次提交是 2 个月前。
我会坚持认为,我显然不是进行无偏见比较的合适人选。这就是为什么我以前从来没有写过这个。我本可以多次发表关于此的博客文章,但我总是不理会这个想法。然而,随着表单应用程序(和支持引导的应用程序)的碎片化越来越多,我认为这可能是写下我的想法的好时机。我希望这对 Django 的新手有所帮助。
干杯, 米格尔
【讨论】:
感谢您的详细回复,对我也很有用。如果你也可以写博客就好了,不要退缩! :-) 谢谢。现在情况可能已经改变了。您能否总结一下 django 中表单渲染的当前状态,以及引导程序中的压力?碎片化仍然是一个问题,还是您已经收敛到标准解决方案?以上是关于如何将 Django forms.ChoiceField 呈现为 Twitter Bootstrap 下拉菜单的主要内容,如果未能解决你的问题,请参考以下文章
Django + Angular:如何将 angularjs $http 数据或参数发送到 django 并在 django 中解释?
Django - 如何将 javascript 变量保存到 Django 数据库中? [复制]
Django - 如何将 InMemoryUploadedFile 转换为 ImageField 的 FieldFile?