Open In App

Django ModelForm - Create form from Models

Last Updated : 19 May, 2025
Comments
Improve
Suggest changes
Like Article
Like
Report

ModelForm is a class that automatically generates a "form" from a Django model. It reduces boilerplate code by linking your form fields directly to your model fields, making form creation faster, cleaner, and less error-prone. It also provides built-in methods and validation to streamline form processing.

Example of converting a model into a Django Form?

To explain the working of the project, we will use project geeksforgeeks, create a model and map it to Django forms.

Refer to the following articles to check how to create a project and an app in Django.

Step 1: Create the Model

In geeks/models.py, define a model as follows:

Python
from django.db import models
 
class GeeksModel(models.Model):
    title = models.CharField(max_length = 200)
    description = models.TextField()
    last_modified = models.DateTimeField(auto_now_add = True)
    img = models.ImageField(upload_to = "images/")

    def __str__(self):
        return self.title

This model has a title, description, timestamp, and an image.

Step 2: Register Your App

Before creating migrations, ensure the geeks app is added to the INSTALLED_APPS list in your project's settings.py:

INSTALLED_APPS = [
# other apps,
'geeks',
]

Step 3: Make Migrations and Migrate

Run the following commands to create and apply the migration for your model:

Python manage.py makemigrations
Python manage.py migrate

Step 4: Verify Model Creation

You can verify that the model is registered by visiting the Django admin interface:

http://127.0.0.1:8000/admin/geeks/geeksmodel/add/

django-modelform-modelStep 5: Create the ModelForm

In geeks/forms.py, create a ModelForm class to automatically generate a form based on your model:

Python
from django import forms
from .models import GeeksModel

class GeeksForm(forms.ModelForm):
    class Meta:
        model = GeeksModel
        fields = "__all__"

This form takes two arguments fields or exclude.

fields vs exclude

  • fields: A list or special value '__all__' indicating which model fields should be included in the form. It is highly recommended to explicitly specify the fields to avoid potential security risks.
  • exclude: A list of fields to exclude from the form. For example:
Python
class PartialGeeksForm(forms.ModelForm):
    class Meta:
        model = GeeksModel
        exclude = ['img']

Step 6: Use the ModelForm in Your View

Update your view to instantiate and process the form data:

Python
from django.shortcuts import render
from .forms import GeeksForm

def home_view(request):
    context ={}
    
    form = GeeksForm(request.POST or None, request.FILES or None)

    if form.is_valid():
        form.save()

    context['form']= form
    return render(request, "home.html", context)
django-modelform-form

Everything is set, Now visit "http://127.0.0.1:8000/",  Now you can see that every model field is mapped into a form field and displayed correspondingly. Field mappings are discussed later in this article. So now let's try entering data into the form and check if it gets saved into the database. 

django-modelform-enter-data

Hit submit and Bingo the form gets saved automatically to database. We can verify it at:

http://localhost:8000/admin/geeks/geeksmodel/

django-modelform-save-model

Field types

The generated Form class will have a form field for every model field specified, in the order specified in the fields attribute. Each model field has a corresponding default form field. For example, a CharField on a model is represented as a CharField on a form. A model ManyToManyField is represented as a MultipleChoiceField. Here is the full list of conversions:

Model FieldForm Field
AutoFieldNot represented in the form
BigAutoFieldNot represented in the form
BigIntegerFieldIntegerField with min_value set to -9223372036854775808 and max_value set to 9223372036854775807.
BinaryFieldCharField, if editable is set to True on the model field, otherwise not represented in the form.
BooleanFieldBooleanField, or NullBooleanField if null=True.
CharFieldCharField with max_length set to the model field’s max_length and empty_value set to None if null=True.
DateFieldDateField
DateTimeFieldDateTimeField
DecimalFieldDecimalField
DurationFieldDurationField
EmailFieldEmailField
FileFieldFileField
FilePathFieldFilePathField
FloatFieldFloatField
ForeignKeyModelChoiceField
ImageFieldImageField
IntegerFieldIntegerField
IPAddressFieldIPAddressField
GenericIPAddressFieldGenericIPAddressField
ManyToManyFieldModelMultipleChoiceField
NullBooleanFieldNullBooleanField
PositiveIntegerFieldIntegerField
PositiveSmallIntegerFieldIntegerField
SlugFieldSlugField
SmallAutoFieldNot represented in the form
TextFieldCharField with widget=forms.Textarea
TimeFieldTimeField
URLFieldURLField

Next Article
Practice Tags :

Similar Reads