Opened 15 years ago

Last modified 13 years ago

#11905 closed

modelform_factory returns a broken form when given wrong value for fields — at Version 4

Reported by: ben Owned by: nobody
Component: Forms Version: 1.1
Severity: Keywords: modelform_factory, modelform, fields
Cc: Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Russell Keith-Magee)

modelform_factory is breaking where you ask for an invalid fields option (even if the field exists):

Here's a doctest that demonstrates:

>>> from django.forms.models import modelform_factory, form_for_fields
>>> from django.contrib.auth.models import User
>>> Form = modelform_factory(User, fields=['id', 'username'])
>>> Form.base_fields
{'id': None, 'username': <django.forms.fields.CharField object at 0xd4e4ad0>}
>>> print Form()
------------------------------------------------------------
Traceback (most recent call last):
  ...
    if self.field.label is None:
AttributeError: 'NoneType' object has no attribute 'label'

Likewise you can specify fields that don't even exist on the model:

>>> Form = modelform_factory(User, fields=['no-field', 'username'])
>>> Form.base_fields
{'no-field': None, 'username': <django.forms.fields.CharField object at 0xd4eec10>}
>>> print Form()
------------------------------------------------------------
Traceback (most recent call last):
  ...
    if self.field.label is None:
AttributeError: 'NoneType' object has no attribute 'label'

This appears to be due to logic in form_for_fields (line 102 in my checkout) in the first case, and fields_for_model (line 170) in the second.

I'd propose some error handling be put in place to give meaningfull exception in either of these cases rather than return a broken form to the user.

I'm happy to submit a patch (I can't do it from here as I'm at work and don't have direct access to django's svn repo) but I can do it from home.

Ben

Change History (4)

comment:1 by ben, 15 years ago

Sorry screwed up the formatting, try:

>>> from django.forms.models import modelform_factory, form_for_fields
>>> from django.contrib.auth.models import User
>>> Form = modelform_factory(User, fields=['id', 'username'])
>>> Form.base_fields
{'id': None, 'username': <django.forms.fields.CharField object at 0xd4e4ad0>}
>>> print Form()
Traceback (most recent call last):
    ....
    if self.field.label is None:
AttributeError: 'NoneType' object has no attribute 'label'

>>> Form = modelform_factory(User, fields=['no-field', 'username'])
>>> Form.base_fields
{'no-field': None, 'username': <django.forms.fields.CharField object at 0xd4eec10>}
>>> print Form()
Traceback (most recent call last):
    ....
AttributeError: 'NoneType' object has no attribute 'label'

comment:2 by Rémy Hubscher, 15 years ago

I wish this could have a patch as mentionned.

I get the same error on the SVN version and I don't know what is wrong.
http://paste.pocoo.org/show/146130/

Thank you.

comment:3 by Johnny82, 14 years ago

I have the same error

Caught an exception while rendering: 'NoneType' object has no attribute 'label'


it's occurs on Admin page when i want to use editor to add data to a Model
if comment such models field, and remove it from Admin class for that model, all works fine

techspec = models.ManyToManyField('TechSpec', through = 'ModelTechSpec')

comment:4 by Russell Keith-Magee, 14 years ago

Description: modified (diff)
milestone: 1.2
Triage Stage: UnreviewedAccepted
Note: See TracTickets for help on using tickets.
Back to Top