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?
As described in Creating forms from models - Selecting the fields to use, there are three ways:
editable=False
. All forms created from the model will exclude the field.fields
attribute in the Meta
inner class to only include the fields you want.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',)
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.
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']
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With