Kaydet (Commit) 69977d20 authored tarafından Brian Rosner's avatar Brian Rosner

Fixed #10622 -- Resolved an issue with model inheritence and list_editable.…

Fixed #10622 -- Resolved an issue with model inheritence and list_editable. Thanks oyvind and Alex Gaynor.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@10178 bcc190cf-cafb-0310-a4f2-bffc1f526a37
üst f0b7cc4a
...@@ -70,7 +70,7 @@ pagination = register.inclusion_tag('admin/pagination.html')(pagination) ...@@ -70,7 +70,7 @@ pagination = register.inclusion_tag('admin/pagination.html')(pagination)
def result_headers(cl): def result_headers(cl):
lookup_opts = cl.lookup_opts lookup_opts = cl.lookup_opts
for i, field_name in enumerate(cl.list_display): for i, field_name in enumerate(cl.list_display):
attr = None attr = None
try: try:
...@@ -97,7 +97,7 @@ def result_headers(cl): ...@@ -97,7 +97,7 @@ def result_headers(cl):
raise AttributeError, \ raise AttributeError, \
"'%s' model or '%s' objects have no attribute '%s'" % \ "'%s' model or '%s' objects have no attribute '%s'" % \
(lookup_opts.object_name, cl.model_admin.__class__, field_name) (lookup_opts.object_name, cl.model_admin.__class__, field_name)
try: try:
header = attr.short_description header = attr.short_description
except AttributeError: except AttributeError:
...@@ -237,7 +237,7 @@ def items_for_result(cl, result, form): ...@@ -237,7 +237,7 @@ def items_for_result(cl, result, form):
result_repr = conditional_escape(result_repr) result_repr = conditional_escape(result_repr)
yield mark_safe(u'<td%s>%s</td>' % (row_class, result_repr)) yield mark_safe(u'<td%s>%s</td>' % (row_class, result_repr))
if form: if form:
yield mark_safe(force_unicode(form[cl.model._meta.pk.attname])) yield mark_safe(force_unicode(form[cl.model._meta.pk.name]))
def results(cl): def results(cl):
if cl.formset: if cl.formset:
......
...@@ -143,10 +143,10 @@ class Person(models.Model): ...@@ -143,10 +143,10 @@ class Person(models.Model):
name = models.CharField(max_length=100) name = models.CharField(max_length=100)
gender = models.IntegerField(choices=GENDER_CHOICES) gender = models.IntegerField(choices=GENDER_CHOICES)
alive = models.BooleanField() alive = models.BooleanField()
def __unicode__(self): def __unicode__(self):
return self.name return self.name
class Meta: class Meta:
ordering = ["id"] ordering = ["id"]
...@@ -236,6 +236,18 @@ def redirect_to(request, selected): ...@@ -236,6 +236,18 @@ def redirect_to(request, selected):
class ExternalSubscriberAdmin(admin.ModelAdmin): class ExternalSubscriberAdmin(admin.ModelAdmin):
actions = [external_mail, redirect_to] actions = [external_mail, redirect_to]
class Media(models.Model):
name = models.CharField(max_length=60)
class Podcast(Media):
release_date = models.DateField()
class PodcastAdmin(admin.ModelAdmin):
list_display = ('name', 'release_date')
list_editable = ('release_date',)
ordering = ('name',)
admin.site.register(Article, ArticleAdmin) admin.site.register(Article, ArticleAdmin)
admin.site.register(CustomArticle, CustomArticleAdmin) admin.site.register(CustomArticle, CustomArticleAdmin)
admin.site.register(Section, inlines=[ArticleInline]) admin.site.register(Section, inlines=[ArticleInline])
...@@ -246,6 +258,7 @@ admin.site.register(Person, PersonAdmin) ...@@ -246,6 +258,7 @@ admin.site.register(Person, PersonAdmin)
admin.site.register(Persona, PersonaAdmin) admin.site.register(Persona, PersonaAdmin)
admin.site.register(Subscriber, SubscriberAdmin) admin.site.register(Subscriber, SubscriberAdmin)
admin.site.register(ExternalSubscriber, ExternalSubscriberAdmin) admin.site.register(ExternalSubscriber, ExternalSubscriberAdmin)
admin.site.register(Podcast, PodcastAdmin)
# 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:
...@@ -259,5 +272,3 @@ admin.site.register(ExternalSubscriber, ExternalSubscriberAdmin) ...@@ -259,5 +272,3 @@ admin.site.register(ExternalSubscriber, ExternalSubscriberAdmin)
admin.site.register(Book, inlines=[ChapterInline]) admin.site.register(Book, inlines=[ChapterInline])
admin.site.register(Promo) admin.site.register(Promo)
admin.site.register(ChapterXtra1) admin.site.register(ChapterXtra1)
# coding: utf-8 # coding: utf-8
import re import re
import datetime
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
...@@ -12,7 +13,7 @@ from django.contrib.admin.helpers import ACTION_CHECKBOX_NAME ...@@ -12,7 +13,7 @@ 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 from models import Article, CustomArticle, Section, ModelWithStringPrimaryKey, Person, Persona, FooAccount, BarAccount, Subscriber, ExternalSubscriber, Podcast
try: try:
set set
...@@ -740,6 +741,12 @@ class AdminViewListEditable(TestCase): ...@@ -740,6 +741,12 @@ class AdminViewListEditable(TestCase):
def tearDown(self): def tearDown(self):
self.client.logout() self.client.logout()
def test_inheritance(self):
Podcast.objects.create(name="This Week in Django",
release_date=datetime.date.today())
response = self.client.get('/test_admin/admin/admin_views/podcast/')
self.failUnlessEqual(response.status_code, 200)
def test_changelist_input_html(self): def test_changelist_input_html(self):
response = self.client.get('/test_admin/admin/admin_views/person/') response = self.client.get('/test_admin/admin/admin_views/person/')
# 2 inputs per object(the field and the hidden id field) = 6 # 2 inputs per object(the field and the hidden id field) = 6
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment