跳转到主要内容

未提供项目描述

项目描述

CI Status

这是一个非常灵活的Django管理界面表单构建器。它允许使用 django-content-editor 来构建您的表单,从而实现以下功能:

  • 在CMS中构建自己的表单,而不必要求程序员做出任何更改。

  • 重新排序、添加和删除现有字段。

  • 在表单字段之间添加内容(文本、图像等)。

  • 使用区域添加表单的额外结构,例如构建可配置的多步骤表单(向导)。

  • 使用您需要的所有灵活性和可配置性添加自己的表单字段插件。

如果您只想集成简短简单的表单(例如,联系表单),那么使用 form_designer 可能会更好。feincms3文档中包含一个 指南,说明如何集成它。

高级概述

文档非常简略,对此表示歉意。

模型

FormFieldBase

表单字段必须继承 FormFieldBaseFormFieldBase 只有一个 name 字段。该字段可以用于检查冲突等。基类在代码可能遇到不仅表单字段插件,还包括其他 django-content-editor 插件的地方被使用,后者例如可以用于在表单字段之间添加文本块或其他内容。

FormFieldBase 模型定义了表单字段的基本 API

  • get_fields():返回一个表单字段的字典。

  • get_initial():返回所述字段的初始值。

  • get_cleaners():返回一个可调用对象列表,这些对象接收表单实例,返回清洗后的数据,并可能抛出 ValidationError 异常。

  • get_loaders():返回一个加载器列表。加载器的作用是加载表单提交,例如用于报告目的。加载器是可调用对象,它们接收序列化的表单数据,并返回一个字典,其形状如下: {"name": ..., "label": ..., "value": ...}

FormField

FormField 提供了标准字段(如标签、帮助文本以及字段是否为必填项)的基本属性集。如果您想自定义模型,则不需要使用此模型。它的目的是提供一些好的默认值。

SimpleFieldBase

SimpleFieldBase 应在您的项目中实例化,并可用于以低廉的成本添加对许多基本字段类型(如文本字段、电子邮件字段、复选框、选择字段等)的支持,这些类型使用单个支持数据库表和模型。

SimpleFieldBasefeincms3_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 (15.1 kB 查看哈希值)

上传时间 源代码

构建分布

feincms3_forms-0.5.0-py3-none-any.whl (18.5 kB 查看哈希值)

上传时间 Python 3

支持者