summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorJulien Phalip <jphalip@gmail.com>2012-03-31 18:46:18 +0000
committerJulien Phalip <jphalip@gmail.com>2012-03-31 18:46:18 +0000
commitaafa73db546683edbaefdd17859f2722349e9373 (patch)
treefbc9b22e64e9a032894f978f6b10ac42fc26ba1b /tests
parent13822974dd063a094d46e4c928fb331a738e1d0b (diff)
[1.4.X] Fixed #17972 -- Ensured that admin filters on a foreign key respect the to_field attribute. This fixes a regression introduced in [14674] and Django 1.3. Thanks to graveyboat and Karen Tracey for the report.
Backport of r17854 from trunk. git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.4.X@17858 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'tests')
-rw-r--r--tests/regressiontests/admin_filters/models.py15
-rw-r--r--tests/regressiontests/admin_filters/tests.py68
2 files changed, 80 insertions, 3 deletions
diff --git a/tests/regressiontests/admin_filters/models.py b/tests/regressiontests/admin_filters/models.py
index 2fa6e6631d..deb8ee88c3 100644
--- a/tests/regressiontests/admin_filters/models.py
+++ b/tests/regressiontests/admin_filters/models.py
@@ -13,3 +13,18 @@ class Book(models.Model):
def __unicode__(self):
return self.title
+
+
+class Department(models.Model):
+ code = models.CharField(max_length=4, unique=True)
+ description = models.CharField(max_length=50, blank=True, null=True)
+
+ def __unicode__(self):
+ return self.description
+
+class Employee(models.Model):
+ department = models.ForeignKey(Department, to_field="code")
+ name = models.CharField(max_length=100)
+
+ def __unicode__(self):
+ return self.name \ No newline at end of file
diff --git a/tests/regressiontests/admin_filters/tests.py b/tests/regressiontests/admin_filters/tests.py
index b42dfd700d..d87c447e30 100644
--- a/tests/regressiontests/admin_filters/tests.py
+++ b/tests/regressiontests/admin_filters/tests.py
@@ -4,7 +4,6 @@ import datetime
from django.contrib.admin import (site, ModelAdmin, SimpleListFilter,
BooleanFieldListFilter)
-from django.contrib.admin.options import IncorrectLookupParameters
from django.contrib.admin.views.main import ChangeList
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
@@ -13,7 +12,7 @@ from django.test import TestCase, RequestFactory
from django.test.utils import override_settings
from django.utils.encoding import force_unicode
-from .models import Book
+from .models import Book, Department, Employee
def select_by(dictlist, key, value):
@@ -113,6 +112,9 @@ class DecadeFilterBookAdminParameterEndsWith__In(ModelAdmin):
class DecadeFilterBookAdminParameterEndsWith__Isnull(ModelAdmin):
list_filter = (DecadeListFilterParameterEndsWith__Isnull,)
+class EmployeeAdmin(ModelAdmin):
+ list_display = ['name', 'department']
+ list_filter = ['department']
class ListFiltersTests(TestCase):
@@ -633,4 +635,64 @@ class ListFiltersTests(TestCase):
choices = list(filterspec.choices(changelist))
self.assertEqual(choices[2]['display'], u'the 1990\'s')
self.assertEqual(choices[2]['selected'], True)
- self.assertEqual(choices[2]['query_string'], '?decade__isnull=the+90s') \ No newline at end of file
+ self.assertEqual(choices[2]['query_string'], '?decade__isnull=the+90s')
+
+ def test_fk_with_to_field(self):
+ """
+ Ensure that a filter on a FK respects the FK's to_field attribute.
+ Refs #17972.
+ """
+ modeladmin = EmployeeAdmin(Employee, site)
+
+ dev = Department.objects.create(code='DEV', description='Development')
+ design = Department.objects.create(code='DSN', description='Design')
+ john = Employee.objects.create(name='John Blue', department=dev)
+ jack = Employee.objects.create(name='Jack Red', department=design)
+
+ request = self.request_factory.get('/', {})
+ changelist = self.get_changelist(request, Employee, modeladmin)
+
+ # Make sure the correct queryset is returned
+ queryset = changelist.get_query_set(request)
+ self.assertEqual(list(queryset), [john, jack])
+
+ filterspec = changelist.get_filters(request)[0][-1]
+ self.assertEqual(force_unicode(filterspec.title), u'department')
+ choices = list(filterspec.choices(changelist))
+
+ self.assertEqual(choices[0]['display'], u'All')
+ self.assertEqual(choices[0]['selected'], True)
+ self.assertEqual(choices[0]['query_string'], '?')
+
+ self.assertEqual(choices[1]['display'], u'Development')
+ self.assertEqual(choices[1]['selected'], False)
+ self.assertEqual(choices[1]['query_string'], '?department__code__exact=DEV')
+
+ self.assertEqual(choices[2]['display'], u'Design')
+ self.assertEqual(choices[2]['selected'], False)
+ self.assertEqual(choices[2]['query_string'], '?department__code__exact=DSN')
+
+ # Filter by Department=='Development' --------------------------------
+
+ request = self.request_factory.get('/', {'department__code__exact': 'DEV'})
+ changelist = self.get_changelist(request, Employee, modeladmin)
+
+ # Make sure the correct queryset is returned
+ queryset = changelist.get_query_set(request)
+ self.assertEqual(list(queryset), [john])
+
+ filterspec = changelist.get_filters(request)[0][-1]
+ self.assertEqual(force_unicode(filterspec.title), u'department')
+ choices = list(filterspec.choices(changelist))
+
+ self.assertEqual(choices[0]['display'], u'All')
+ self.assertEqual(choices[0]['selected'], False)
+ self.assertEqual(choices[0]['query_string'], '?')
+
+ self.assertEqual(choices[1]['display'], u'Development')
+ self.assertEqual(choices[1]['selected'], True)
+ self.assertEqual(choices[1]['query_string'], '?department__code__exact=DEV')
+
+ self.assertEqual(choices[2]['display'], u'Design')
+ self.assertEqual(choices[2]['selected'], False)
+ self.assertEqual(choices[2]['query_string'], '?department__code__exact=DSN')