未提供项目描述
项目描述
这是一个非常灵活的Django管理界面表单构建器。它允许使用 django-content-editor 来构建您的表单,从而实现以下功能:
在CMS中构建自己的表单,而不必要求程序员做出任何更改。
重新排序、添加和删除现有字段。
在表单字段之间添加内容(文本、图像等)。
使用区域添加表单的额外结构,例如构建可配置的多步骤表单(向导)。
使用您需要的所有灵活性和可配置性添加自己的表单字段插件。
如果您只想集成简短简单的表单(例如,联系表单),那么使用 form_designer 可能会更好。feincms3文档中包含一个 指南,说明如何集成它。
高级概述
文档非常简略,对此表示歉意。
模型
FormFieldBase
表单字段必须继承 FormFieldBase。 FormFieldBase 只有一个 name 字段。该字段可以用于检查冲突等。基类在代码可能遇到不仅表单字段插件,还包括其他 django-content-editor 插件的地方被使用,后者例如可以用于在表单字段之间添加文本块或其他内容。
FormFieldBase 模型定义了表单字段的基本 API
get_fields():返回一个表单字段的字典。
get_initial():返回所述字段的初始值。
get_cleaners():返回一个可调用对象列表,这些对象接收表单实例,返回清洗后的数据,并可能抛出 ValidationError 异常。
get_loaders():返回一个加载器列表。加载器的作用是加载表单提交,例如用于报告目的。加载器是可调用对象,它们接收序列化的表单数据,并返回一个字典,其形状如下: {"name": ..., "label": ..., "value": ...}。
FormField
FormField 提供了标准字段(如标签、帮助文本以及字段是否为必填项)的基本属性集。如果您想自定义模型,则不需要使用此模型。它的目的是提供一些好的默认值。
SimpleFieldBase
SimpleFieldBase 应在您的项目中实例化,并可用于以低廉的成本添加对许多基本字段类型(如文本字段、电子邮件字段、复选框、选择字段等)的支持,这些类型使用单个支持数据库表和模型。
SimpleFieldBase 在 feincms3_forms.admin 模块中有一个对应的 SimpleFieldInline,它根据字段类型显示和隐藏字段。例如,为复选框定义占位符是没有意义的(浏览器不支持它们),因此该字段在 CMS 中被省略。
渲染器
渲染函数负责创建和实例化表单类。表单类的创建和实例化同时发生。
验证
验证模块提供了在 CMS 中定义表单时的验证实用工具。例如,后端代码可能要求电子邮件字段始终存在,并且始终具有预定义的名称(例如 email 😏)。这些规则目前尚未强制执行,但用户始终会被通知,因此可以选择遵守它们。或者根据您编写的代码,可能会发生一些不好的事情。
报告
报告函数在您想对提交的数据做些事情时非常有用。
安装和用法
创建一个包含表单构建器模型(app.forms.models)的模块
from content_editor.models import Region, create_plugin_base
from django.db import models
from feincms3 import plugins
from feincms3_forms import models as forms_models
class ConfiguredForm(forms_models.ConfiguredForm):
FORMS = [
forms_models.FormType(
key="contact",
label="contact form",
regions=[Region(key="form", title="form")],
# Base class for the dynamically created form:
# form_class="...",
# Validation hook for configured form (the bundled ModelAdmin
# class calls this):
# validate="...",
# Processing function which you can call after submission
# (feincms3-forms never calls this function itself, but it
# may be a nice convention):
process="app.forms.forms.process_contact_form",
),
]
ConfiguredFormPlugin = create_plugin_base(ConfiguredForm)
class SimpleField(forms_models.SimpleFieldBase, ConfiguredFormPlugin):
pass
Text = SimpleField.proxy(SimpleField.Type.TEXT)
Email = SimpleField.proxy(SimpleField.Type.EMAIL)
URL = SimpleField.proxy(SimpleField.Type.URL)
Date = SimpleField.proxy(SimpleField.Type.DATE)
Integer = SimpleField.proxy(SimpleField.Type.INTEGER)
Textarea = SimpleField.proxy(SimpleField.Type.TEXTAREA)
Checkbox = SimpleField.proxy(SimpleField.Type.CHECKBOX)
Select = SimpleField.proxy(SimpleField.Type.SELECT)
Radio = SimpleField.proxy(SimpleField.Type.RADIO)
SelectMultiple = SimpleField.proxy(SimpleField.Type.SELECT_MULTIPLE)
CheckboxSelectMultiple = SimpleField.proxy(SimpleField.Type.CHECKBOX_SELECT_MULTIPLE)
class RichText(plugins.richtext.RichText, ConfiguredFormPlugin):
pass
添加上述引用的处理函数(app.forms.forms)
from django.core.mail import mail_managers
from django.http import HttpResponse
def process_contact_form(request, form, *, configured_form):
mail_managers("Contact form", repr(form.cleaned_data))
return HttpResponseRedirect(".")
添加渲染器和视图(app.forms.views)
from content_editor.contents import contents_for_item
from django.shortcuts import render
from feincms3.renderer import RegionRenderer, render_in_context, template_renderer
from feincms3_forms.renderer import create_form, short_prefix
from app.forms import models
renderer = RegionRenderer()
renderer.register(models.RichText, template_renderer("plugins/richtext.html"))
renderer.register(
models.SimpleField,
lambda plugin, context: render_in_context(
context,
"forms/simple-field.html",
{"plugin": plugin, "fields": context["form"].get_form_fields(plugin)},
),
)
def form(request):
context = {}
cf = models.ConfiguredForm.objects.first()
contents = contents_for_item(cf, plugins=renderer.plugins())
# Add a prefix in case more than one form exists on the same page:
form_kwargs = {"prefix": short_prefix(cf, "form")}
if request.method == "POST":
form_kwargs |= {"data": request.POST, "files": request.FILES}
form = create_form(
contents["form"],
form_class=cf.type.form_class,
form_kwargs=form_kwargs,
)
if form.is_valid():
return cf.type.process(request, form, configured_form=cf)
context["form"] = form
context["form_other_fields"] = form.get_form_fields(None)
context["form_regions"] = renderer.regions_from_contents(contents)
return render(request, "forms/form.html", context)
上述引用的 forms/simple-field.html 模板可能如下所示
{% for field in fields.values %}{{ field }}{% endfor %}
一个示例 forms/form.html
{% extends "base.html" %}
{% load feincms3 i18n %}
{% block content %}
<div class="content">
<form class="form" method="post">
{% csrf_token %}
{{ form.errors }}
{% render_region form_regions 'form' %}
{% for field in form_other_fields.values %}{{ field }}{% endfor %}
<button type="submit">Submit</button>
</form>
</div>
{% endblock content %}
最后,必须将表单添加到管理站点(app.forms.admin)
from content_editor.admin import ContentEditorInline
from django.contrib import admin
from feincms3 import plugins
from feincms3_forms.admin import ConfiguredFormAdmin, SimpleFieldInline
from app.forms import models
@admin.register(models.ConfiguredForm)
class ConfiguredFormAdmin(ConfiguredFormAdmin):
inlines = [
plugins.richtext.RichTextInline.create(model=models.RichText),
SimpleFieldInline.create(
model=models.Text,
button='<i class="material-icons">short_text</i>',
),
SimpleFieldInline.create(
model=models.Email,
button='<i class="material-icons">alternate_email</i>',
),
SimpleFieldInline.create(
model=models.URL,
button='<i class="material-icons">link</i>',
),
SimpleFieldInline.create(
model=models.Date,
button='<i class="material-icons">event</i>',
),
SimpleFieldInline.create(
model=models.Integer,
button='<i class="material-icons">looks_one</i>',
),
SimpleFieldInline.create(
model=models.Textarea,
button='<i class="material-icons">notes</i>',
),
SimpleFieldInline.create(
model=models.Checkbox,
button='<i class="material-icons">check_box</i>',
),
SimpleFieldInline.create(
model=models.Select,
button='<i class="material-icons">arrow_drop_down_circle</i>',
),
SimpleFieldInline.create(
model=models.Radio,
button='<i class="material-icons">radio_button_checked</i>',
),
]
最后但同样重要的是,创建并应用迁移。基本上就是这样。我们还没有触及到配置的表单验证、报告实用工具或创建自己的(复合)字段类型,现在您必须检查测试套件。
项目详情
下载文件
下载适合您平台文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。
源代码分布
构建分布
feincms3_forms-0.5.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d814fdd631149ee38f57cd733f6541f7cd5e72711a1a7225e580f1627085119e |
|
MD5 | 409f68075b712508d019c557a1e1d2d6 |
|
BLAKE2b-256 | a9edc55c940e3ebb5a4ee174347668155f8cf365804ae7f5adaaf755653c38d4 |
feincms3_forms-0.5.0-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | b88360ff92db22da9dc3a6df6addab6d9b0d4401549267b8f0adb8e17e1dc59a |
|
MD5 | 126de0512732896e7ab4577165c96fc4 |
|
BLAKE2b-256 | dcf699e6869630a5d23ac9cdee3a85d8c0d46148cdb316645303b443fe801571 |