Fixed #10002: inline file uploads now correctly display prior data. Thanks, dgouldin.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@10588 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
a075422bfc
commit
1e4ad6f118
|
@ -379,6 +379,9 @@ class BoundField(StrAndUnicode):
|
||||||
data = self.form.initial.get(self.name, self.field.initial)
|
data = self.form.initial.get(self.name, self.field.initial)
|
||||||
if callable(data):
|
if callable(data):
|
||||||
data = data()
|
data = data()
|
||||||
|
else:
|
||||||
|
if isinstance(self.field, FileField) and self.data is None:
|
||||||
|
data = self.form.initial.get(self.name, self.field.initial)
|
||||||
else:
|
else:
|
||||||
data = self.data
|
data = self.data
|
||||||
if not only_initial:
|
if not only_initial:
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
import tempfile
|
||||||
|
import os
|
||||||
|
from django.core.files.storage import FileSystemStorage
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from django.core.mail import EmailMessage
|
from django.core.mail import EmailMessage
|
||||||
|
@ -291,6 +294,27 @@ class EmptyModelAdmin(admin.ModelAdmin):
|
||||||
class OldSubscriberAdmin(admin.ModelAdmin):
|
class OldSubscriberAdmin(admin.ModelAdmin):
|
||||||
actions = None
|
actions = None
|
||||||
|
|
||||||
|
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(Article, ArticleAdmin)
|
||||||
admin.site.register(CustomArticle, CustomArticleAdmin)
|
admin.site.register(CustomArticle, CustomArticleAdmin)
|
||||||
admin.site.register(Section, save_as=True, inlines=[ArticleInline])
|
admin.site.register(Section, save_as=True, inlines=[ArticleInline])
|
||||||
|
@ -306,6 +330,8 @@ admin.site.register(Podcast, PodcastAdmin)
|
||||||
admin.site.register(Parent, ParentAdmin)
|
admin.site.register(Parent, ParentAdmin)
|
||||||
admin.site.register(EmptyModel, EmptyModelAdmin)
|
admin.site.register(EmptyModel, EmptyModelAdmin)
|
||||||
admin.site.register(Fabric, FabricAdmin)
|
admin.site.register(Fabric, FabricAdmin)
|
||||||
|
admin.site.register(Gallery, GalleryAdmin)
|
||||||
|
admin.site.register(Picture, PictureAdmin)
|
||||||
|
|
||||||
# We intentionally register Promo and ChapterXtra1 but not Chapter nor ChapterXtra2.
|
# We intentionally register Promo and ChapterXtra1 but not Chapter nor ChapterXtra2.
|
||||||
# That way we cover all four cases:
|
# That way we cover all four cases:
|
||||||
|
|
|
@ -2,7 +2,9 @@
|
||||||
|
|
||||||
import re
|
import re
|
||||||
import datetime
|
import datetime
|
||||||
|
import os
|
||||||
|
|
||||||
|
from django.core.files import temp as tempfile
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.contrib.auth.models import User, Permission
|
from django.contrib.auth.models import User, Permission
|
||||||
from django.contrib.contenttypes.models import ContentType
|
from django.contrib.contenttypes.models import ContentType
|
||||||
|
@ -13,7 +15,10 @@ from django.contrib.admin.helpers import ACTION_CHECKBOX_NAME
|
||||||
from django.utils.html import escape
|
from django.utils.html import escape
|
||||||
|
|
||||||
# local test models
|
# local test models
|
||||||
from models import Article, CustomArticle, Section, ModelWithStringPrimaryKey, Person, Persona, FooAccount, BarAccount, Subscriber, ExternalSubscriber, Podcast, EmptyModel
|
from models import (Article, BarAccount, CustomArticle, EmptyModel,
|
||||||
|
ExternalSubscriber, FooAccount, Gallery,
|
||||||
|
ModelWithStringPrimaryKey, Person, Persona, Picture,
|
||||||
|
Podcast, Section, Subscriber)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
set
|
set
|
||||||
|
@ -1039,7 +1044,6 @@ class TestInlineNotEditable(TestCase):
|
||||||
response = self.client.get('/test_admin/admin/admin_views/parent/add/')
|
response = self.client.get('/test_admin/admin/admin_views/parent/add/')
|
||||||
self.failUnlessEqual(response.status_code, 200)
|
self.failUnlessEqual(response.status_code, 200)
|
||||||
|
|
||||||
|
|
||||||
class AdminCustomQuerysetTest(TestCase):
|
class AdminCustomQuerysetTest(TestCase):
|
||||||
fixtures = ['admin-views-users.xml']
|
fixtures = ['admin-views-users.xml']
|
||||||
|
|
||||||
|
@ -1062,3 +1066,47 @@ class AdminCustomQuerysetTest(TestCase):
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
else:
|
else:
|
||||||
self.assertEqual(response.status_code, 404)
|
self.assertEqual(response.status_code, 404)
|
||||||
|
|
||||||
|
class AdminInlineFileUploadTest(TestCase):
|
||||||
|
fixtures = ['admin-views-users.xml', 'admin-views-actions.xml']
|
||||||
|
urlbit = 'admin'
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.client.login(username='super', password='secret')
|
||||||
|
|
||||||
|
# Set up test Picture and Gallery.
|
||||||
|
# These must be set up here instead of in fixtures in order to allow Picture
|
||||||
|
# to use a NamedTemporaryFile.
|
||||||
|
tdir = tempfile.gettempdir()
|
||||||
|
file1 = tempfile.NamedTemporaryFile(suffix=".file1", dir=tdir)
|
||||||
|
file1.write('a' * (2 ** 21))
|
||||||
|
filename = file1.name
|
||||||
|
file1.close()
|
||||||
|
g = Gallery(name="Test Gallery")
|
||||||
|
g.save()
|
||||||
|
p = Picture(name="Test Picture", image=filename, gallery=g)
|
||||||
|
p.save()
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
self.client.logout()
|
||||||
|
|
||||||
|
def test_inline_file_upload_edit_validation_error_post(self):
|
||||||
|
"""
|
||||||
|
Test that inline file uploads correctly display prior data (#10002).
|
||||||
|
"""
|
||||||
|
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)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue