Whenever you create an instance of UploadFileForm you need to explicitly tell it to not show the title. In the first 4 lines of your view, you do it correctly, but if you receive post data, your code does not do anything with show_title, and since you set it to True by default, it will get included.
By the way, here is an updated UploadFileForm, which preservers *args and **kwargs class UploadFileForm(forms.Form): def __init__ (self, *args, **kwargs): show_title = kwargs.pop('show_title', Ttrue) super (BaseClass, self).__init__(*args, **kwargs) if not show_title: del self.fields['title'] ... You still need to explicitly pass in show_title = False if you do not want the title to be present on the form. Otherwise you could change it to kwargs.pop('show_title', False), but then you need to explicitly tell it when you want the title field. I still think it would be better to simply use subclasses of the same form. With the example I gave in a previous message, you could use it as follows: def upload_image(request, ...): model_class = Image form_class = UploadForm return upload_file(request, model_class, form_class) def upload_thumbnail(request, ...): model_class = Thumbnail form_class = UploadThumbnailForm return upload_file(request, model_class, form_class) def upload_file(request, model_class, form_class): object = get_object_or_404(model, ....) form = form_class(request.POST or None) if form.is_valid(): ... Regards Knut On Tue, Nov 9, 2010 at 1:16 PM, Ed <edmund.rog...@gmail.com> wrote: > I'm still a bit confused, apologies. > > This is the beginning of the 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) > > How would I pass in show_title correctly? I tried rewriting the last > line: form = UploadFileForm(request.POST, request.FILES, > show_title=False) , but I got an error on submission: __init() got > multiple values for keyword argument 'show_title' > > And in terms of correctly passing the variable, does it need to be > explicitly passed in the 3rd line above: form = UploadFileForm(), when > I want the title shown? Or simply when grabbing the request.POST/ > FILES? > > Thank you for your help so far, > Ed > > On Nov 9, 3:33 am, Knut Ivar Nesheim <knu...@gmail.com> wrote: >> The problem is here: >> >> if request.method == 'POST': >> form = UploadFileForm(request.POST, request.FILES) >> >> You need to make sure you always pass in show_title correctly when >> instantiating the form. >> >> Regards >> Knut >> >> >> >> >> >> >> >> On Tue, Nov 9, 2010 at 3:57 AM, Ed <edmund.rog...@gmail.com> wrote: >> > 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 >> > 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. > > -- 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.