Skip to main content


Project description



Change Log

  • 0.4*
    • Django 1.9/1.10/1.11 compatibility
    • Cleaner error messages
    • Form within a form fixes
  • 0.3
    • Django 1.6/1.7/1.8 compatibility
    • Python 3.4 compatibility
    • Form argument can now be dynamic
  • 0.2
    • Fix Django 1.5 install issue
  • 0.1.3
    • Fixed bug when a form’s initial value evaludated to False
    • pep8 related fixes

Getting Started

django-formfield is a form field that accepts a django form as its first argument, and validates as well as render’s each form field as expected. Yes a form within a form, within a dream? There are two types of fields available, FormField and ModelFormField. For ModelFormField the data is stored in json. For FormField data is simply returned as a python dictionary (form.cleaned_data)


Installation is easy using pip or easy_install.

pip install django-formfield


easy_install django-formfield

Add to installed apps



from django.db import models
from django import forms

from formfield import ModelFormField

class PersonMetaForm(forms.Form):
    age = forms.IntegerField()
    sex = forms.ChoiceField(choices=((1, 'male'), (2, 'female')), required=False)

class Person(models.Model):
    name = CharField(max_length=200)

    meta_info = ModelFormField(form=PersonMetaForm)

Which will result in something like this (using the admin)

The ModelFormField is automatically set to null=True, blank=True, this is because validation is done on the inner form. As a result you will see something like the following if we hit save on the change form:

If we supply the change for valid data you should get a python dictionary when retrieving the data:

>>> person = Person.objects.get(pk=1)
>>> person.meta_info
{u'age': 12, u'sex': u'1'}

The form is the only thing forcing valid input, behind the scenes the data is being serialized into json. Therefore on the python level we can supply meta_info any valid json::

>>> from sample_app.models import Person
>>> data = {'some': 'thing', 'is': 'wrong', 'here': 'help!'}
>>> p = Person.objects.create(name="Joan", meta_info=data)
>>> p.meta_info
{'is': 'wrong', 'some': 'thing', 'here': 'help!'}


If the form field is being made available via a change form, such as the admin, any unexpected value will be overridden by what the form returns . For example, the PersonMetaForm above only expects age and sex, so none of the values above (‘is’, ‘some’ and ‘here’) match and will be overridden when the form submitted.

We can however, make the field hidden or readonly and use it to supply any valid json, but its not really the intension of this app.

Project details

Release history Release notifications

This version
History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Filename, size & hash SHA256 hash help File type Python version Upload date
django-formfield-0.4.tar.gz (807.2 kB) Copy SHA256 hash SHA256 Source None Apr 19, 2017

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging CloudAMQP CloudAMQP RabbitMQ AWS AWS Cloud computing Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page