Django ModelForm with extra fields that are not in the model

EDIT 2020 (Django 2 or higher)

In Django 2+ you can add the extra fields like this:

class ProfileForm(forms.ModelForm):
    
    extra_field = forms.ImageField()

    class Meta:
        model = User
        fields = ['username', 'country', 'website', 'biography']

Original answer (Django 1)

It’s possible to extend Django ModelForm with extra fields. Imagine you have a custom User model and this ModelForm:

class ProfileForm(forms.ModelForm):

    class Meta:
        model = User
        fields = ['username', 'country', 'website', 'biography']

Now, imagine you want to include an extra field (not present in your User model, lets say an image avatar). Extend your form by doing this:

from django import forms

class AvatarProfileForm(ProfileForm):

    profile_avatar = forms.ImageField()

    class Meta(ProfileForm.Meta):
        fields = ProfileForm.Meta.fields + ('profile_avatar',)

Finally (given that the form has an ImageField), remember to include request.FILES when instantiating the form in your view:

# (view.py)

def edit_profile(request):
    ...
    form = AvatarProfileForm(
        request.POST or None, 
        request.FILES or None, 
        instance=request.user
    )
    ...

Hope it helps. Good luck!

EDIT:

I was getting a “can only concatenate tuple (not “list”) to tuple” error in AvatarProfileForm.Meta.fields attribute. Changed it to a tuple and it worked.

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)