Index: django/forms/forms.py
===================================================================
--- django/forms/forms.py (revision 10214)
+++ django/forms/forms.py (working copy)
@@ -371,7 +371,10 @@
if callable(data):
data = data()
else:
- data = self.data
+ if isinstance(self.field, FileField) and self.data is None:
+ data = self.form.initial.get(self.name, self.field.initial)
+ else:
+ data = self.data
if not only_initial:
name = self.html_name
else:
Index: tests/regressiontests/admin_views/fixtures/admin-views-users.xml
===================================================================
--- tests/regressiontests/admin_views/fixtures/admin-views-users.xml (revision 10214)
+++ tests/regressiontests/admin_views/fixtures/admin-views-users.xml (working copy)
@@ -88,6 +88,14 @@
2009-03-18 11:54:58
1
+
+
\ No newline at end of file
Index: tests/regressiontests/admin_views/tests.py
===================================================================
--- tests/regressiontests/admin_views/tests.py (revision 10214)
+++ tests/regressiontests/admin_views/tests.py (working copy)
@@ -2,7 +2,9 @@
import re
import datetime
+import os
+from django.core.files import temp as tempfile
from django.test import TestCase
from django.contrib.auth.models import User, Permission
from django.contrib.contenttypes.models import ContentType
@@ -946,3 +948,37 @@
}
response = self.client.post('/test_admin/admin/admin_views/externalsubscriber/', action_data)
self.failUnlessEqual(response.status_code, 302)
+
+class AdminInlineFileUploadTest(TestCase):
+ fixtures = ['admin-views-users.xml', 'admin-views-actions.xml']
+ urlbit = 'admin'
+
+ def setUp(self):
+ self.client.login(username='super', password='secret')
+
+ # upload test file for Picture fixture
+ tdir = tempfile.gettempdir()
+ image = open(os.path.join(tdir, u'test.jpg'.encode('utf-8')), 'w+b')
+ image.write('b' * (2 ** 10))
+ image.close()
+
+ def tearDown(self):
+ self.client.logout()
+
+ def testInlineFileUploadEditValidationErrorPost(self):
+ post_data = {
+ "name": u"Test Gallery",
+ "pictures-TOTAL_FORMS": u"2",
+ "pictures-INITIAL_FORMS": u"1",
+ "pictures-0-id": u"1",
+ "pictures-0-gallery": u"1",
+ "pictures-0-name": "Test Picture",
+ "pictures-0-image": "",
+ "pictures-1-id": "",
+ "pictures-1-gallery": "1",
+ "pictures-1-name": "Test Picture 2",
+ "pictures-1-image": "",
+ }
+ response = self.client.post('/test_admin/%s/admin_views/gallery/1/' % self.urlbit, post_data)
+ self.failUnless(response._container[0].find("Currently:") > -1)
+
Index: tests/regressiontests/admin_views/models.py
===================================================================
--- tests/regressiontests/admin_views/models.py (revision 10214)
+++ tests/regressiontests/admin_views/models.py (working copy)
@@ -1,4 +1,7 @@
# -*- coding: utf-8 -*-
+import tempfile
+import os
+from django.core.files.storage import FileSystemStorage
from django.db import models
from django.contrib import admin
from django.core.mail import EmailMessage
@@ -248,6 +251,27 @@
ordering = ('name',)
+temp_storage = FileSystemStorage(tempfile.mkdtemp())
+UPLOAD_TO = os.path.join(temp_storage.location, 'test_upload')
+
+class Gallery(models.Model):
+ name = models.CharField(max_length=100)
+
+class Picture(models.Model):
+ name = models.CharField(max_length=100)
+ image = models.FileField(storage=temp_storage, upload_to='test_upload')
+ gallery = models.ForeignKey(Gallery, related_name="pictures")
+
+class PictureInline(admin.TabularInline):
+ model = Picture
+ extra = 1
+
+class GalleryAdmin(admin.ModelAdmin):
+ inlines = [PictureInline]
+
+class PictureAdmin(admin.ModelAdmin):
+ pass
+
admin.site.register(Article, ArticleAdmin)
admin.site.register(CustomArticle, CustomArticleAdmin)
admin.site.register(Section, inlines=[ArticleInline])
@@ -259,6 +283,8 @@
admin.site.register(Subscriber, SubscriberAdmin)
admin.site.register(ExternalSubscriber, ExternalSubscriberAdmin)
admin.site.register(Podcast, PodcastAdmin)
+admin.site.register(Gallery, GalleryAdmin)
+admin.site.register(Picture, PictureAdmin)
# We intentionally register Promo and ChapterXtra1 but not Chapter nor ChapterXtra2.
# That way we cover all four cases: