It appears that the usage of FileField with ModelForm is not working
correctly. [1] is the ticket in Trac. The problem, put briefly, is that
when a ModelForm is given an instance it is marked as required and
requires the user to upload a file to bypass the validation. Keep in
mind that if the FileField is explicitly marked as not required then
this is a non-issue.
This is currently a bug in the newforms-admin that I have been working
on for a little while now. After working alot on the formset refactor
patch the problem really seems to lie in newforms itself.
This wasn't a problem with the form_for_* helper functions since
form_for_instance knew the model data when creating the form class.
That is why the FileField model class has the following code in its
formfield method:
# If a file has been provided previously, then the form doesn't require
# that a new file is provided this time.
if 'initial' in kwargs:
defaults['required'] = False
This will no longer work correctly because initial will never be passed
in the kwargs since the form creation is now done in the
ModelFormMetaclass. In looking at the FileInput widget tests it makes
note that its data is useless due to the nature of how file uploads are
handled. That makes complete sense, however, is causing this problem
when the data is coming from the model and not the web browser.
To write a patch I created a new widget named BoundFileInput that
inherits from MultiWidget to display the FileInput and HiddenInput
widgets. The FileInput widget works the same as it does now. The
HiddenInput widget maintains the data that came from the model. As I
understand it this is how it used to work in oldforms, but perhaps just
the admin in trunk.
This is where the problem comes in. To hook BoundFileInput widget into
the correct place I found out that doing so in the newforms FileField
__init__ method is still too soon to check for the initial data. This
then made me realize that perhaps this actually had to be done in the
BaseForm. It wouldn't seem correct to do this only in the ModelForm,
but perhaps I am wrong.
I then figured that changing the widget based on the initial data in
the BaseForm __init__ still seems very hackish, but I may be wrong
again. I then remebered about BoundField which basically defines a
field and its data. Well, that is only used for the display of the
widget as opposed to both display and validation. This seems to be a
gap that might need to be filled to accomplish this fix properly.
So, with all that said I ask:
1. Should FileInput be aware of its data since one use-case is valid.
2. How should the widget be handled when a validation error occurs?
Any ideas/ensight would be greatly appreciated.
[1]: http://code.djangoproject.com/ticket/6302
--
Brian Rosner
http://oebfare.com
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Django developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/django-developers?hl=en
-~----------~----~----~----~------~----~------~--~---