Django ModelForm with extra fields that are not in the model


Question

I have done a ModelForm adding some extra fields that are not in the model. I use these fields for some calcualtions when saving the form.

The extra fields appear on the form and they are sent in the POST request when uploading the form. The problem is they are not added to the cleaned_data dictionary when I validate the form. How can I access them?

1
35
5/15/2016 10:19:18 AM

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.

23
12/18/2017 9:29:42 PM

Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow
Icon