I can fall back on the subclassing suggestion.  But I'd like to give
this one more shot for a fix.  I think it has something to do with the
request.FILES that I need.  Here is my complete form:

class UploadFileForm(forms.Form):
        def __init__(self, show_title=True, *args, **kwargs):
                super(UploadFileForm, self).__init__(*args, **kwargs)
                if not show_title:
                        del self.fields['title']

        def clean_file(self):
                content = self.cleaned_data['file']
                content_type = content.content_type.split('/')[0]
                if content_type in settings.CONTENT_TYPES:
                        if content._size > settings.MAX_UPLOAD_SIZE:
                                raise forms.ValidationError(_('Please keep 
filesize under %s.
Current filesize %s') % (filesizeformat(settings.MAX_UPLOAD_SIZE),
filesizeformat(content._size)))
                else:
                        raise forms.ValidationError(_('File type is not 
supported'))
                return content

        title = forms.CharField(max_length=50)
        file = forms.ImageField(label='Select photo to upload')


And here is my complete view:

def upload_file(request, modelname, id):
        if modelname == 'film':
                form = UploadFileForm()
        else:
                form = UploadFileForm(show_title=False)

        object = get_object_or_404(modelname, id__iexact=id)
        if request.method == 'POST':
                form = UploadFileForm(request.POST, request.FILES)
                if form.is_valid():
                        file = request.FILES["file"]
                        filename = file.name
                        content = file.read()

                        # Assign unique name to file
                        new_image_name, extension = unique_name(filename, 
object,
modelname)

                        #FUTURE: Resize middle and resize remaining in 
background
                        #SMALL
                        #img_resizer(content)
                        u_small = new_image_name + '_small.jpg'
                        store_in_s3(u_small, img_resizer(content,250,250,90))

                        # Save thumbnail url to object
                        object.url_small = u_small
                        object.save()

                        # Grab Next param to determine where to redirect back to
                        redirect_to = request.GET.get('next', 
reverse('index_view'))
                        return HttpResponseRedirect(redirect_to)
                else:
                        # If form validation fails, use original reverse url
                        redirect_to = request.GET.get('next', 
reverse('index_view'))

        else:
                # If first loading form, grab referer and pass to form
                referer = request.META.get('HTTP_REFERER', None)

                # Pass original location in next url param
                if referer is None:
                        redirect_to = reverse('index_view')
                else:
                        try:
                                redirect_to = urlsplit(referer, 'http', 
False)[2]
                        except IndexError:
                                redirect_to = reverse('index_view')


        return render_to_response('upload.html', {'form': form,'obj':
object,'redirect_to':redirect_to}, context_instance =
RequestContext(request))

If I remove the def __init__ from the form class, it works perfectly,
but always shows the title.  But with that in the form class, it
always says "This field is required."  For just the imagefield if the
title is suppressed or for both the title and the imagefield if the
title is not suppressed.

Suggestions?

On Nov 8, 3:47 pm, Knut Ivar Nesheim <knu...@gmail.com> wrote:
> Maybe you could just use subclassing instead of doing stuff at run-time:
>
> class UploadForm(forms.Form):
>     file = ...
>     # custom upload and validation code here
>
> class ThumbnailUploadForm(UploadForm):
>     pass
>
> class UploadFileForm(UploadForm):
>     title = ...
>
> As for your current approach, it looks correct. I've done the same
> several times and it works as expected. Make sure you are really
> really passing show_title correctly in your thumbnail case.
>
> Regards
> Knut
>
> On Mon, Nov 8, 2010 at 9:29 PM, Ed <edmund.rog...@gmail.com> wrote:
> > I have an image upload form that takes a title and a file for its
> > field. I have two uses for it. Most of the time I call it, I need both
> > a title and the image itself. But when I call it simply to grab a
> > thumbnail, I don't need the title. In fact, the form data is saved to
> > a different model that doesn't even have title as a field.
>
> > I wanted to suppress the "title" field when I call the form. I could
> > have created two form classes in my forms.py, but this seemed
> > unnecessarily repetitious.
>
> > I included the following in my image form class:
>
> > def __init__ (self, show_title=True):
> >    super (BaseClass, self).__init__()
> >    if not show_title:
> >        del self.fields['title']
>
> > This works great except for one thing. Now I'm getting validation
> > errors: "This field is required" whether I suppress the title field or
> > not. Any time I try to submit the form, it tells me I need to enter
> > data.  Any advice on how to do this correctly?
>
> > class UploadFileForm(forms.Form):
> >    def __init__ (self, show_title=True):
> >        super (BaseClass, self).__init__()
> >        if not show_title:
> >            del self.fields['title']
>
> >    title = forms.CharField(max_length=50)
> >    file = forms.ImageField(label='Select photo to upload')
>
> > --
> > You received this message because you are subscribed to the Google Groups 
> > "Django users" group.
> > To post to this group, send email to django-us...@googlegroups.com.
> > To unsubscribe from this group, send email to 
> > django-users+unsubscr...@googlegroups.com.
> > For more options, visit this group 
> > athttp://groups.google.com/group/django-users?hl=en.

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to