martintrapp
martintrapp

Reputation: 829

Django model form - Exclude a field that has no model field

I have a simple model form what I use through the admin interface. Some of my model fields store datas that require a bit more time to calculate (they come from other sites). So I decided to put an extra boolean field to the form to decide to crawl these datas again or not.

class MyModelForm(forms.ModelForm):
    update_values = forms.BooleanField(required=False) #this field has no model field

    class Meta:
        model = MyModel

This extra field doesn't exist in the model because only the form needs it.

The problem is that I only want it to appear if it's an existing record in the database.

def __init__(self, *args, **kwargs):
    super(MyModelForm, self).__init__(*args, **kwargs)
    if self.instance.pk is None:
        #remove that field somehow

I tried nearly everything. Exclude it, delete the variable but nothing wants to work. I also tried dynamically add the field if self.instance.pk is exists but that didn't work too.

Any idea how to do the trick?

Thanks for your answers.

Upvotes: 0

Views: 922

Answers (2)

Daniel Roseman
Daniel Roseman

Reputation: 600051

Rather than removing the field in __init__ if instance.pk is not None, how about adding it if it is None? Remove the class-level declaration and just change the logic:

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel

    def __init__(self, *args, **kwargs):
        super(MyModelForm, self).__init__(*args, **kwargs)
        if self.instance and self.instance.pk is not None:
            self.fields['update_values'] = forms.BooleanField(required=False) 

Upvotes: 0

sk1p
sk1p

Reputation: 6725

You could subclass the form and add the extra field in the subclass:

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel

class MyUpdateModelForm(MyModelForm):
    update_values = forms.BooleanField(required=False) #this field has no model field

    class Meta:
        model = MyModel

You can then override the get_form method of your admin, which is passed the current instance: get_form(self, request, obj=None, **kwargs)

Upvotes: 1

Related Questions