summaryrefslogtreecommitdiff
path: root/tests/admin_views
diff options
context:
space:
mode:
Diffstat (limited to 'tests/admin_views')
-rw-r--r--tests/admin_views/models.py32
-rw-r--r--tests/admin_views/test_autocomplete_view.py56
2 files changed, 87 insertions, 1 deletions
diff --git a/tests/admin_views/models.py b/tests/admin_views/models.py
index 4ab2bc8eee..284a4cfacb 100644
--- a/tests/admin_views/models.py
+++ b/tests/admin_views/models.py
@@ -338,6 +338,24 @@ class Child(models.Model):
raise ValidationError('invalid')
+class PKChild(models.Model):
+ """
+ Used to check autocomplete to_field resolution when ForeignKey is PK.
+ """
+ parent = models.ForeignKey(Parent, models.CASCADE, primary_key=True)
+ name = models.CharField(max_length=128)
+
+ class Meta:
+ ordering = ['parent']
+
+ def __str__(self):
+ return self.name
+
+
+class Toy(models.Model):
+ child = models.ForeignKey(PKChild, models.CASCADE)
+
+
class EmptyModel(models.Model):
def __str__(self):
return "Primary key = %s" % self.id
@@ -615,12 +633,26 @@ class Song(models.Model):
class Employee(Person):
code = models.CharField(max_length=20)
+ class Meta:
+ ordering = ['name']
+
class WorkHour(models.Model):
datum = models.DateField()
employee = models.ForeignKey(Employee, models.CASCADE)
+class Manager(Employee):
+ """
+ A multi-layer MTI child.
+ """
+ pass
+
+
+class Bonus(models.Model):
+ recipient = models.ForeignKey(Manager, on_delete=models.CASCADE)
+
+
class Question(models.Model):
big_id = models.BigAutoField(primary_key=True)
question = models.CharField(max_length=20)
diff --git a/tests/admin_views/test_autocomplete_view.py b/tests/admin_views/test_autocomplete_view.py
index c57fb106ed..aa978f7a83 100644
--- a/tests/admin_views/test_autocomplete_view.py
+++ b/tests/admin_views/test_autocomplete_view.py
@@ -12,7 +12,10 @@ from django.test import RequestFactory, override_settings
from django.urls import reverse, reverse_lazy
from .admin import AnswerAdmin, QuestionAdmin
-from .models import Answer, Author, Authorship, Book, Question
+from .models import (
+ Answer, Author, Authorship, Bonus, Book, Employee, Manager, Parent,
+ PKChild, Question, Toy, WorkHour,
+)
from .tests import AdminViewBasicTestCase
PAGINATOR_SIZE = AutocompleteJsonView.paginate_by
@@ -37,6 +40,12 @@ site.register(Question, QuestionAdmin)
site.register(Answer, AnswerAdmin)
site.register(Author, AuthorAdmin)
site.register(Book, BookAdmin)
+site.register(Employee, search_fields=['name'])
+site.register(WorkHour, autocomplete_fields=['employee'])
+site.register(Manager, search_fields=['name'])
+site.register(Bonus, autocomplete_fields=['recipient'])
+site.register(PKChild, search_fields=['name'])
+site.register(Toy, autocomplete_fields=['child'])
@contextmanager
@@ -118,6 +127,51 @@ class AutocompleteJsonViewTests(AdminViewBasicTestCase):
'pagination': {'more': False},
})
+ def test_to_field_resolution_with_mti(self):
+ """
+ to_field resolution should correctly resolve for target models using
+ MTI. Tests for single and multi-level cases.
+ """
+ tests = [
+ (Employee, WorkHour, 'employee'),
+ (Manager, Bonus, 'recipient'),
+ ]
+ for Target, Remote, related_name in tests:
+ with self.subTest(target_model=Target, remote_model=Remote, related_name=related_name):
+ o = Target.objects.create(name="Frida Kahlo", gender=2, code="painter", alive=False)
+ opts = {
+ 'app_label': Remote._meta.app_label,
+ 'model_name': Remote._meta.model_name,
+ 'field_name': related_name,
+ }
+ request = self.factory.get(self.url, {'term': 'frida', **opts})
+ request.user = self.superuser
+ response = AutocompleteJsonView.as_view(**self.as_view_args)(request)
+ self.assertEqual(response.status_code, 200)
+ data = json.loads(response.content.decode('utf-8'))
+ self.assertEqual(data, {
+ 'results': [{'id': str(o.pk), 'text': o.name}],
+ 'pagination': {'more': False},
+ })
+
+ def test_to_field_resolution_with_fk_pk(self):
+ p = Parent.objects.create(name="Bertie")
+ c = PKChild.objects.create(parent=p, name="Anna")
+ opts = {
+ 'app_label': Toy._meta.app_label,
+ 'model_name': Toy._meta.model_name,
+ 'field_name': 'child',
+ }
+ request = self.factory.get(self.url, {'term': 'anna', **opts})
+ request.user = self.superuser
+ response = AutocompleteJsonView.as_view(**self.as_view_args)(request)
+ self.assertEqual(response.status_code, 200)
+ data = json.loads(response.content.decode('utf-8'))
+ self.assertEqual(data, {
+ 'results': [{'id': str(c.pk), 'text': c.name}],
+ 'pagination': {'more': False},
+ })
+
def test_field_does_not_exist(self):
request = self.factory.get(self.url, {'term': 'is', **self.opts, 'field_name': 'does_not_exist'})
request.user = self.superuser