mirror of
https://github.com/django/django.git
synced 2025-07-18 16:49:13 +00:00
[1.0.X] Fixed #10516 -- Corrected admin search when the search_fields definition contains multiple fields on the same base model. Thanks to Zain Memon
Merge of r10684 from trunk. git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.0.X@10719 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
7bcbc99b9e
commit
41ba8e7ca6
@ -227,11 +227,8 @@ class ChangeList(object):
|
|||||||
|
|
||||||
if self.search_fields and self.query:
|
if self.search_fields and self.query:
|
||||||
for bit in self.query.split():
|
for bit in self.query.split():
|
||||||
or_queries = [models.Q(**{construct_search(field_name): bit}) for field_name in self.search_fields]
|
or_queries = [models.Q(**{construct_search(str(field_name)): bit}) for field_name in self.search_fields]
|
||||||
other_qs = QuerySet(self.model)
|
qs = qs.filter(reduce(operator.or_, or_queries))
|
||||||
other_qs.dup_select_related(qs)
|
|
||||||
other_qs = other_qs.filter(reduce(operator.or_, or_queries))
|
|
||||||
qs = qs & other_qs
|
|
||||||
for field_name in self.search_fields:
|
for field_name in self.search_fields:
|
||||||
if '__' in field_name:
|
if '__' in field_name:
|
||||||
qs = qs.distinct()
|
qs = qs.distinct()
|
||||||
|
@ -0,0 +1,107 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"pk": 1,
|
||||||
|
"model": "admin_views.title",
|
||||||
|
"fields":
|
||||||
|
{
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"pk": 2,
|
||||||
|
"model": "admin_views.title",
|
||||||
|
"fields":
|
||||||
|
{
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"pk": 3,
|
||||||
|
"model": "admin_views.title",
|
||||||
|
"fields":
|
||||||
|
{
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"pk": 4,
|
||||||
|
"model": "admin_views.title",
|
||||||
|
"fields":
|
||||||
|
{
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"pk": 1,
|
||||||
|
"model": "admin_views.titletranslation",
|
||||||
|
"fields":
|
||||||
|
{
|
||||||
|
"text": "Bar",
|
||||||
|
"title": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"pk": 2,
|
||||||
|
"model": "admin_views.titletranslation",
|
||||||
|
"fields":
|
||||||
|
{
|
||||||
|
"text": "Foo",
|
||||||
|
"title": 2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"pk": 3,
|
||||||
|
"model": "admin_views.titletranslation",
|
||||||
|
"fields":
|
||||||
|
{
|
||||||
|
"text": "Few",
|
||||||
|
"title": 3
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"pk": 4,
|
||||||
|
"model": "admin_views.titletranslation",
|
||||||
|
"fields":
|
||||||
|
{
|
||||||
|
"text": "Bas",
|
||||||
|
"title": 4
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"pk": 1,
|
||||||
|
"model": "admin_views.recommender",
|
||||||
|
"fields":
|
||||||
|
{
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"pk": 4,
|
||||||
|
"model": "admin_views.recommender",
|
||||||
|
"fields":
|
||||||
|
{
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"pk": 2,
|
||||||
|
"model": "admin_views.recommendation",
|
||||||
|
"fields":
|
||||||
|
{
|
||||||
|
"recommender": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"pk": 3,
|
||||||
|
"model": "admin_views.recommendation",
|
||||||
|
"fields":
|
||||||
|
{
|
||||||
|
"recommender": 4
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
@ -238,6 +238,24 @@ class GalleryAdmin(admin.ModelAdmin):
|
|||||||
class PictureAdmin(admin.ModelAdmin):
|
class PictureAdmin(admin.ModelAdmin):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
# a base class for Recommender and Recommendation
|
||||||
|
class Title(models.Model):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TitleTranslation(models.Model):
|
||||||
|
title = models.ForeignKey(Title)
|
||||||
|
text = models.CharField(max_length=100)
|
||||||
|
|
||||||
|
class Recommender(Title):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class Recommendation(Title):
|
||||||
|
recommender = models.ForeignKey(Recommender)
|
||||||
|
|
||||||
|
class RecommendationAdmin(admin.ModelAdmin):
|
||||||
|
search_fields = ('titletranslation__text', 'recommender__titletranslation__text',)
|
||||||
|
|
||||||
|
|
||||||
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])
|
||||||
@ -250,6 +268,8 @@ admin.site.register(EmptyModel, EmptyModelAdmin)
|
|||||||
admin.site.register(Fabric, FabricAdmin)
|
admin.site.register(Fabric, FabricAdmin)
|
||||||
admin.site.register(Gallery, GalleryAdmin)
|
admin.site.register(Gallery, GalleryAdmin)
|
||||||
admin.site.register(Picture, PictureAdmin)
|
admin.site.register(Picture, PictureAdmin)
|
||||||
|
admin.site.register(Recommendation, RecommendationAdmin)
|
||||||
|
admin.site.register(Recommender)
|
||||||
|
|
||||||
# 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:
|
||||||
|
@ -816,6 +816,21 @@ class AdminViewUnicodeTest(TestCase):
|
|||||||
response = self.client.post('/test_admin/admin/admin_views/book/1/delete/', delete_dict)
|
response = self.client.post('/test_admin/admin/admin_views/book/1/delete/', delete_dict)
|
||||||
self.assertRedirects(response, '/test_admin/admin/admin_views/book/')
|
self.assertRedirects(response, '/test_admin/admin/admin_views/book/')
|
||||||
|
|
||||||
|
class AdminSearchTest(TestCase):
|
||||||
|
fixtures = ['admin-views-users','multiple-child-classes']
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.client.login(username='super', password='secret')
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
self.client.logout()
|
||||||
|
|
||||||
|
def test_search_on_sibling_models(self):
|
||||||
|
"Check that a search that mentions sibling models"
|
||||||
|
response = self.client.get('/test_admin/admin/admin_views/recommendation/', data={'q':'bar'})
|
||||||
|
# confirm the search returned 1 object
|
||||||
|
self.assertContains(response, "\n1 recommendation\n")
|
||||||
|
|
||||||
class AdminInheritedInlinesTest(TestCase):
|
class AdminInheritedInlinesTest(TestCase):
|
||||||
fixtures = ['admin-views-users.xml',]
|
fixtures = ['admin-views-users.xml',]
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user