Skip to main content

Form Designer - a simple form designer for Django

https://github.com/feincms/form-designer/actions/workflows/tests.yml/badge.svg

This form designer does not try to offer every last configuration possibility of Django’s forms, just through the administration interface instead of directly in Python code. Instead, it strives to be a tool which everyone can use right away, without the need for long explanations.

It offers a small set of predefined input fields such as:

  • Text fields (One line and multi line widgets possible)

  • E-mail address fields

  • Checkboxes

  • Dropdowns

  • Radio Buttons

  • Multiple selection checkboxes

  • Hidden input fields

Every field can optionally be declared mandatory, default values and help texts are available too. That’s it.

The default actions (which can be enabled individually) are to send the form data to a list of freely definable email addresses and to store the data in the database so that it can be exported later. An XLSX export of saved submissions is provided too. It is possible to add your own actions as well.

Aside: If you need more options you may want to check out feincms3-forms as well.

Installing the form designer

Install the package using pip:

$ pip install form-designer

Setting up the form designer

  • Add "form_designer" and "admin_ordering" to INSTALLED_APPS.

  • Run ./manage.py migrate form_designer

  • Go into Django’s admin panel and add one or more forms with the fields you require. Also select at least one action in the configuration options selectbox, most often you’d want to select both the “E-mail” and the “Save form submission” option and fill in one ore more email addresses.

Choices for selection fields are split on , or alternatively |; use pipe character when individual choices need to contain commas.

If you’re using the form designer with FeinCMS, the content type can be imported from form_designer.contents.FormContent. Otherwise, your code should use the following methods (the code would probably reside in a view):

# Somehow fetch the form_designer.models.Form instance:
instance = get_object_or_404()

# Build the form class:
form_class = instance.form_class()

# Standard form processing:
if request.method == "POST":
    form = form_class(request.POST)

    if form.is_valid():
        # Do what you want, or run the configured processors:
        result = instance.process(form, request)

        # Maybe there's something useful in here:
        pprint(result)

        return HttpResponseRedirect("thanks/")
else:
    form = form_class()

return render(request, "form.html", {"form": form})

Adding custom actions

Custom actions can be added by appending them to Form.CONFIG_OPTIONS:

from form_designer.models import Form

def do_thing(model_instance, form_instance, request, config, **kwargs):
    pass

def do_validate(form_instance, data):
    pass

Form.CONFIG_OPTIONS.append(
    (
        "do_thing",
        {
            "title": _("Do a thing"),
            "form_fields": lambda form: [
                ("optional_form_field", forms.CharField(
                    label=_("Optional form field"),
                    required=False,
                    # validators...
                    # help_text...
                )),
            ],
            "process": do_thing,
            "validate": do_validate,
        },
    )
)

The interesting part is the do_thing callable. It currently receives four arguments, however you should also accept **kwargs to support additional arguments added in the future:

  • model_instance: The Form model instance

  • form_instance: The dynamically generated form instance

  • request: The current HTTP request

  • config: The config options (keys and values defined through form_fields; for example the email action defines an email char field, and accesses its value using config["email"]).

ReCaptcha

To enable ReCaptcha install django-recaptcha and add django_recaptcha to your INSTALLED_APPS. This will automatically add a ReCaptcha field to the form designer. For everything else read through the django-recaptcha readme.

reCAPTCHA keys only work with either v2 or v3. Both field types are offered by default; set FORM_DESIGNER_RECAPTCHA_VERSION to "v2" or "v3" to only offer the one matching your keys:

FORM_DESIGNER_RECAPTCHA_VERSION = "v3"

Existing form fields using the other field type will crash, so change them first.

Name the field captcha to omit it from submission data, see Omitted fields.

Simple Captcha

To enable django-simple-captcha install django-simple-captcha and add captcha to your INSTALLED_APPS as described in the documentation for django-simple-captcha. This will automatically add a “Simple Captcha” field to the form designer field types.

Name the field captcha to omit it from submission data, see Omitted fields.

Omitted fields

Fields matching any of the glob patterns in FORM_DESIGNER_OMIT_FIELDS are left out of the submission data and the XLSX export. The default omits captcha and fields starting with _:

FORM_DESIGNER_OMIT_FIELDS = ("captcha", "_*")

Set it to () to include all fields, as in previous versions.

Email action

The email action sends submissions to a comma separated list of addresses. The subject defaults to the form title, but can be set in the action config. %(fieldname)s placeholders are replaced with submitted values (unknown fields become empty), other % signs are kept as-is.

For testing and staging setups, set FORCE_MAIL_RECIPIENT in settings.py to an address to send all submission mails there instead.

FORCE_MAIL_RECIPIENT = "test@nowhere.example"

Override field types

Define FORM_DESIGNER_FIELD_TYPES in your settings file like:

FORM_DESIGNER_FIELD_TYPES = "your_project.form_designer_config.FIELD_TYPES"

In your_project.form_designer_config.py something like:

from django import forms
from django.utils.translation import gettext_lazy as _

FIELD_TYPES = [
    {"type": "text", "verbose_name": _("text"), "field": forms.CharField},
    {"type": "email", "verbose_name": _("email address"), "field": forms.EmailField},
]

Visit these sites for more information

Metadata

Release files for form-designer 0.28.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for form-designer 0.28.1
File Size Uploaded Provenance Actions
form_designer-0.28.1.tar.gz 25.8 kB With provenance Details for form_designer-0.28.1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for form-designer 0.28.1
File Interpreter ABI Platform Actions
form_designer-0.28.1-py3-none-any.whl Python 3 none any Details for form_designer-0.28.1-py3-none-any.whl

Total release size: 68.5 kB

Release files / form_designer-0.28.1.tar.gz

Download URL form_designer-0.28.1.tar.gz
Size 25.8 kB
Tags Source
SHA-256 checksum
How to use checksums
27851c008a9f7b1781b2020f68faf3d11abbe3b3235beeb184366f48f85cf064
BLAKE2b-256 checksum
How to use checksums
572186b031f47a106fadac3f31264eb4465156cd82c4e66241e60fff23b27247
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 28, 2026.

Transparency log

Release files / form_designer-0.28.1-py3-none-any.whl

Download URL form_designer-0.28.1-py3-none-any.whl
Size 42.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9e1c6aef9ac841f109eb1a551dab38e41a131228e258bcfeabbe40da731e1695
BLAKE2b-256 checksum
How to use checksums
df1af097667567756deb3f6bfdd99febc11a4f24fb6442bf9dd8460ea18d85ef
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 28, 2026.

Transparency log

Security for form-designer 0.28.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for form_designer-0.28.1.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 28, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.28.1 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page