Django表单工具
项目描述
此应用程序提供增强Django表单处理的工具
BetterForm 和 BetterModelForm 类,分别是 django.forms.Form 和 django.forms.ModelForm 的子类。 BetterForm 和 BetterModelForm 允许将表单细分为模板可迭代的字段集,并且允许定义 row_attrs,可以从模板中访问以将属性应用到特定表单字段的周围容器(<li>、<tr>等)。
各种有用的模板过滤器,允许模板作者在不修改Python代码的情况下更好地控制自定义表单渲染: 标签、值文本、选择值、可选、是否复选框 和 是否多选。
ClearableFileField,用于增强 FileField 和 ImageField,并带有清除字段内容的复选框。
ImageWidget,它显示图像的缩略图而不是只是文件名。
AutoResizeTextarea 小部件,它可以自动调整大小以适应其内容。
安装
使用 easy_install 或 pip 从PyPI安装
pip install django-form-utils
要在Django项目中使用django-form-utils,只需在INSTALLED_APPS设置中包含form_utils即可。django-form-utils不提供任何模型,但将其包含在INSTALLED_APPS中会使form_utils模板标签库可用。
您还可以通过在templates/form_utils/better_form.html和templates/form_utils/form.html中提供替代模板来覆盖默认的表单渲染模板。
依赖项
django-form-utils已在Django 1.4及更高版本和Python 2.6、2.7和3.3上进行了测试。已知与Python 3.0、3.1和3.2不兼容。
ImageWidget需要Python Imaging Library。 sorl-thumbnail或easy-thumbnails是可选的,但没有它将显示完整大小的图像而不是缩略图。默认缩略图大小为200px x 200px。
AutoResizeTextarea需要jQuery(默认使用Google提供的版本;请参阅JQUERY_URL)。
使用方法
BetterForm
简单地将您的表单类从form_utils.forms.BetterForm继承(而不是django.forms.Form),或将模型表单类从form_utils.forms.BetterModelForm继承,并定义内部Meta类的fieldsets和/或row_attrs属性
class MyForm(BetterForm): one = forms.CharField() two = forms.CharField() three = forms.CharField() class Meta: fieldsets = [('main', {'fields': ['two'], 'legend': ''}), ('Advanced', {'fields': ['three', 'one'], 'description': 'advanced stuff', 'classes': ['advanced', 'collapse']})] row_attrs = {'one': {'style': 'display: none'}}
fieldsets
Fieldset定义类似于ModelAdmin fieldset定义:每个fieldset都是一个包含名称和选项字典的两个元组。字典中有效的fieldset选项包括
- fields
(必需) 在此fieldset中显示的字段名称的元组。
- classes
应用于fieldset的额外CSS类名元组/列表。
- legend
如果存在此值,它将是打开fieldset的legend标签的内容。如果不存在,则使用fieldset的名称(因此,如果不需要legend,则必须使用空值‘’)。
- description
要显示在fieldset下方legend的字符串,为可选的额外文本。
当迭代BetterForm(或BetterModelForm)的fieldsets属性时,会生成Fieldset。每个Fieldset都有一个name属性、一个legend属性、一个classes属性(将classes元组折叠成空格分隔的字符串),以及一个description属性,并且当迭代时,会生成其BoundField。
为了与向后兼容,BetterForm或BetterModelForm仍可以直接迭代以生成所有BoundField,无论是否有fieldsets。
如果您在 BetterModelForm 上设置了 fieldsets,并且没有在该表单类上设置 fields 或 exclude 选项,BetterModelForm 将会设置 fields 为在您的 fieldsets 定义中存在的所有字段的列表。这避免了因为未在 fieldset 中列出所有字段而导致无法验证的表单问题。如果您手动设置了 fields 或 exclude,BetterModelForm 假设您知道自己在做什么,并且不会修改这些定义,即使它们与您的 fieldsets 中列出的字段不匹配。
有关更详细的示例,请参阅 tests/tests.py 中的测试。
row_attrs
row_attrs 声明是一个将字段名映射到属性/值对字典的字典。属性/值字典将被转换为 HTML 风格的属性/值(例如,{‘style’: ‘display: none’} 将变为 style="display: none"),并且将作为 BoundField 的 row_attrs 属性可用。
BetterForm 或 BetterModelForm 会自动将 CSS 类 "required" 或 "optional" 添加到每个 BoundField 的 row_attrs 中,具体取决于该字段是否为必填项,并且如果字段有错误,还会添加 "error" CSS 类。
渲染
渲染 BetterForm 的可能模板
{% if form.non_field_errors %}{{ form.non_field_errors }}{% endif %} {% for fieldset in form.fieldsets %} <fieldset class="{{ fieldset.classes }}"> {% if fieldset.legend %} <legend>{{ fieldset.legend }}</legend> {% endif %} {% if fieldset.description %} <p class="description">{{ fieldset.description }}</p> {% endif %} <ul> {% for field in fieldset %} {% if field.is_hidden %} {{ field }} {% else %} <li{{ field.row_attrs }}> {{ field.errors }} {{ field.label_tag }} {{ field }} </li> {% endif %} {% endfor %} </ul> </fieldset> {% endfor %}
如果需要进行特殊处理,可以直接访问 fieldset,例如。
{% for field in form.fieldsets.main %} ... {% endfor %}
django-form-utils 还提供了一个方便的模板过滤器,render。它被这样使用
{% load form_utils %} {{ form|render }}
默认情况下,它将检查表单是否为 BetterForm,如果是,则使用模板 form_utils/better_form.html 进行渲染。如果不是,则使用模板 form_utils/form.html 进行渲染。(在两种情况下,表单对象都将作为 form 传递给渲染模板的上下文)。
render 过滤器还接受一个可选参数,它是一个用于渲染表单的模板名称或逗号分隔的模板名称列表。
{{ form|render:"my_form_stuff/custom_form_template.html" }}
实用过滤器
以下所有过滤器都需要在它们使用的模板中包含 {% load form_utils %}。
这些过滤器是 django-widget-tweaks 库中发现的实用过滤器的补充,用于在表单字段小部件上设置任意属性和类;因此,django-form-utils 中没有提供此类过滤器。
label
通过渲染模板 forms/_label.html 并使用上下文 field(绑定字段对象)、id(表单字段 id 属性)和 label_text 来渲染给定表单字段的标签标签。
默认情况下,使用表单字段的 Python 定义文本作为标签文本,但可以提供替代标签文本作为过滤器的参数。
{{ form.fieldname|label:"Alternate label" }}
value_text
以人类可读的方式显示给定表单字段的当前值(即显示选择值的标签而不是内部值)。当前值可能是默认值(对于首次渲染表单)或先前输入的值(对于带有错误的重复渲染表单)。用法
{{ form.fieldname|value_text }}
selected_values
与value_text类似,但用于多选表单字段,并返回所选值的列表而不是单个字符串。用法
<ul> {% for selected_value in form.multiselect|selected_values %} <li>{{ selected_value }}</li> {% endfor %} </ul>
可选
如果给定字段是可选的,则返回True,如果它是必需的,则返回False。示例用法
{% if form.fieldname|optional %}(optional){% endif %}
is_checkbox
如果给定字段的控件是CheckboxInput,则返回True,否则返回False。示例用法
{% if form.fieldname|is_checkbox %} {{ form.fieldname }} {{ form.fieldname|label }} {% else %} {{ form.fieldname|label }} {{ form.fieldname }} {% endif %}
is_multiple
如果给定字段是MultipleChoiceField,则返回True,否则返回False。示例用法
{% if form.fieldname|is_multiple %} {% for value in form.fieldname|selected_values %}{{ value }} {% endif %} {% else %} {{ form.fieldname|value_text }} {% endif %}
ClearableFileField
是django.forms.FileField的替代品,它具有一个复选框来清除现有文件的字段。像使用其他表单字段类一样使用
from django import forms from form_utils.fields import ClearableFileField class MyModelForm(forms.ModelForm): pdf = ClearableFileField()
ClearableFileField还接受两个关键字参数,file_field和template。
file_field是实际用于表示文件部分的实例化字段。例如,如果您想使用ClearableFileField来替换ImageField,并且想使用ImageWidget,您可以这样操作
from django import forms from form_utils.fields import ClearableFileField from form_utils.widgets import ImageWidget class MyModelForm(forms.ModelForm): avatar = ClearableFileField( file_field=forms.ImageField(widget=ImageWidget))
默认情况下,file_field是一个普通的forms.FileField,带有默认的forms.FileInput控件。
template是一个字符串,定义了如何相对于彼此显示FileField(或替代file_field)和清除复选框。模板字符串应包含变量插值标记%(input)s和%(checkbox)s。默认值是%(input)s 清除:%(checkbox)s。
要在管理界面中使用ClearableFileField,只需从form_utils.admin.ClearableFileFieldsAdmin继承您的管理选项类,而不是从django.contrib.admin.ModelAdmin继承,该模型中的所有FileField和ImageField将自动变为可清除的(同时仍然使用它们原本会使用的相同的文件/图像字段/控件,包括在formfield_overrides中提供的任何覆盖)。
ClearableImageField
form_utils.fields.ClearableImageField只是一个将默认文件字段设置为forms.ImageField而不是forms.FileField的ClearableFileField。
ImageWidget
这是一个用于表示ImageField的控件,它包括字段中当前图像的缩略图,而不仅仅是文件的名称。(如果安装了sorl-thumbnail,则提供缩略图;否则显示全尺寸图像)。使用时,只需将其作为ImageField的控件类传递即可
from django import forms from form_utils.widgets import ImageWidget class MyForm(forms.Form): pic = forms.ImageField(widget=ImageWidget())
ImageWidget接受一个关键字参数,template。这是一个定义图像缩略图和文件输入控件相对于彼此如何渲染的字符串。模板字符串应包含变量插值标记%(input)s和%(image)s。默认值是%(input)s<br />%(image)s。例如,要将图像显示在输入上方而不是下方
pic = forms.ImageField( widget=ImageWidget(template='%(image)s<br />%(input)s'))
要在管理界面中使用,请使用formfield_overrides将ImageField的默认控件设置为
from django.db import models from form_utils.widgets import ImageWidget class MyModelAdmin(admin.ModelAdmin): formfield_overrides = { models.ImageField: {'widget': ImageWidget}}
AutoResizeTextarea
只需导入小部件并将其分配给表单字段
from django import forms from form_utils.widgets import AutoResizeTextarea class MyForm(forms.Form): description = forms.CharField(widget=AutoResizeTextarea())
或者,在您的 ModelAdmin 子类中使用 formfield_overrides
from django import forms from django.contrib import admin from form_utils.widgets import AutoResizeTextarea class MyModelAdmin(admin.ModelAdmin): formfield_overrides = {forms.CharField: {'widget': AutoResizeTextarea()}}
还有一个 InlineAutoResizeTextarea,它提供适合在表格内联中使用的小型默认尺寸。
设置
JQUERY_URL
AutoResizeTextarea 需要jQuery JavaScript库。默认情况下,django-form-utils 链接到在ajax.googleapis.com上可用的最新次要版本的jQuery 1.8(通过URL https://ajax.googleapis.ac.cn/ajax/libs/jquery/1.8/jquery.min.js)。如果您想使用jQuery的不同版本或自行托管它,请设置JQUERY_URL设置。例如
JQUERY_URL = 'jquery.min.js'
这将使用在STATIC_URL/jquery.min.js中可用的jQuery。请注意,相对的 JQUERY_URL 是相对于 STATIC_URL 的。
变更
1.0.3 (2015-08-25)
修复了与Django 1.9的兼容性。修复了GH-12。
1.0.2 (2014-09-08)
修复了与Django 1.7的兼容性。修复了BB-20和GH-8。
1.0.1 (2013-10-19)
移除了无效的 python_2_unicode_compatible 使用,这破坏了 https://github.com/django/django/commit/589dc49e129f63801c54c15e408c944a345b3dfe。感谢ocZio的报告。
修复了表单Meta类的继承。感谢chmodas。修复了BB-16。
1.0 (2013.08.22)
添加了Python 3.3兼容性。感谢chmodas!(合并了GH-5。)
0.3.1 (2013.06.25)
从 ImageWidget.render 调用 FileInput.render,确保在HTML中不输出任何值。修复了GH-4。感谢Aron Griffis。
0.3.0 (2013.06.04)
向后不兼容:将模板标签库的名称从 form_utils_tags 更改为 form_utils。
向后不兼容:删除了 FORM_UTILS_MEDIA_URL 设置,并更新为在整个项目中使用 STATIC_URL 而不是 MEDIA_URL。
将“error”类添加到具有错误的字段的row_attrs中。感谢Aron Griffis。
停止对Django 1.4之前和Python 2.6之前版本的支持。
0.2.0 (2011.01.28)
为ImageWidget添加宽度和高参数。
使ImageWidget对图像检测后端友好,不直接使用PIL。修复了问题#7。
修复了默认模板对单选/复选框输入标签的渲染。
修复了ClearableFileField绑定表单的错误重新显示。
如果未手动设置 fields 或 exclude,则自动将 BetterModelForm 上的 fields 设置为存在于 fieldsets 中的字段列表。
更新为允许对fieldsets进行 __getitem__ 访问。
0.1.8 (2010.03.16)
将PIL导入限制在ImageWidget中
添加了AutoResizeTextarea
0.1.7 (2009.12.02)
修复了admin.py中的ClearableFileField导入。
0.1.6 (2009.11.24)
为ImageWidget和ClearableFileField添加了文档和测试。
将ClearableFileField从widgets.py移动到fields.py。
将doctests转换为unittests。
0.1.5 (2009.11.10)
添加了fieldset类(以前仅存在于文档中)。
0.1.0 (2009-03-26)
首次公开发布。
项目详情
django-form-utils-1.0.3.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 670d0c6ce809aa91f17b6cb8905dab7a56d054191251540d5d011649c4fda108 |
|
MD5 | d785b085efdfb29ad28d11abcd81d2d3 |
|
BLAKE2b-256 | fe4e0d860844f52081507e7d16349682c184768abebadb92af5fbb852bb64bfd |