Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Remove fields from ModelForm

Tags:

django

i have a simple ModelForm:

class MyForm(ModelForm):

    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        del self.fields['name']

As you can see, I try to remove a field from the form's field list (the field definitively exists in the model), but I get an Exception:

TemplateSyntaxError at [..]

Caught an exception while rendering: "Key 'name' not found in Form"

I did not write a custom form, so the template where the error occurs is:

/templates/admin/includes/fieldset.html, error at line 4

Any ideas?

-- UPDATE --

The problem appears only in the admin area.

-- UPDATE 2 --

Maybe a trace dump gives more info:

Original Traceback (most recent call last):
  File "/Library/Python/2.5/site-packages/django/template/debug.py", line 71, in render_node
    result = node.render(context)
  File "/Library/Python/2.5/site-packages/django/template/defaulttags.py", line 155, in render
    nodelist.append(node.render(context))
  File "/Library/Python/2.5/site-packages/django/template/defaulttags.py", line 239, in render
    value = bool_expr.resolve(context, True)
  File "/Library/Python/2.5/site-packages/django/template/__init__.py", line 546, in resolve
    obj = self.var.resolve(context)
  File "/Library/Python/2.5/site-packages/django/template/__init__.py", line 687, in resolve
    value = self._resolve_lookup(context)
  File "/Library/Python/2.5/site-packages/django/template/__init__.py", line 722, in _resolve_lookup
    current = current()
  File "/Library/Python/2.5/site-packages/django/contrib/admin/helpers.py", line 81, in errors
    return mark_safe(u'\n'.join([self.form[f].errors.as_ul() for f in self.fields]).strip('\n'))
  File "/Library/Python/2.5/site-packages/django/forms/forms.py", line 105, in __getitem__
    raise KeyError('Key %r not found in Form' % name)
KeyError: "Key 'name' not found in Form"

In the admin area, I use the Grapelli-Theme. Maybe this has to do with the problem?

like image 766
schneck Avatar asked Sep 23 '09 14:09

schneck


4 Answers

As described in Creating forms from models - Selecting the fields to use, there are three ways:

  1. In the model, set editable=False. All forms created from the model will exclude the field.
  2. Define the fields attribute in the Meta inner class to only include the fields you want.
  3. Define the exclude attribute in the Meta inner class to list the fields you don't want.

So if your model has fields field1, field2, and field3 and you don't want field3, technique #2 would look like this:

class MyModelForm(ModelForm):
    class Meta:
        model = MyModel
        fields = ('field1', 'field2')

And technique #3 would look like this:

class MyModelForm(ModelForm):
    class Meta:
        model = MyModel
        exclude = ('field3',)
like image 100
Selene Avatar answered Nov 16 '22 09:11

Selene


I had the same problem. This is how I made it work in the new Django (trunk):

class MyModelAdmin(admin.ModelAdmin):
    # Your stuff here..

    def get_form(self, request, obj=None, **kwargs):
        if request.user.is_staff: # condition
            self.exclude = ('field',)
        return super(PublishAdmin, self).get_form(request, obj=obj, **kwargs)

By overriding the get_form method and putting the logic here you can select which Form you want to have displayed. Above I have displayed the standard form when a condition was met.

like image 20
wunki Avatar answered Nov 16 '22 08:11

wunki


This works great...

def __init__(self, instance, *args, **kwargs):    
    super(FormClass, self).__init__(instance=instance, *args, **kwargs)
    if instance and instance.item:
        del self.fields['field_for_item']
like image 3
oak Avatar answered Nov 16 '22 09:11

oak


One cause I can think of is if your ModelAdmin class which uses your custom form has conflicting settings. For example if you have also explicitly specified 'name' field within 'fields' or 'fieldsets' of your ModelAdmin.

like image 1
Botond Béres Avatar answered Nov 16 '22 07:11

Botond Béres