Skip to content

Instantly share code, notes, and snippets.

@codingjoe
Last active October 31, 2019 05:27
Show Gist options
  • Save codingjoe/5c5ef8087f8d71dbd4b4373bbc39ffaa to your computer and use it in GitHub Desktop.
Save codingjoe/5c5ef8087f8d71dbd4b4373bbc39ffaa to your computer and use it in GitHub Desktop.
From a7e3b566f5cfdc8a8685cb38e3709c46c42fcb9d Mon Sep 17 00:00:00 2001
From: Johannes Hoppe <info@johanneshoppe.com>
Date: Thu, 31 Oct 2019 14:20:25 +0900
Subject: [PATCH] Review suggestions
---
django/contrib/admin/static/admin/js/autocomplete.js | 3 ++-
django/contrib/admin/views/autocomplete.py | 9 +++------
django/contrib/admin/widgets.py | 10 +++++-----
tests/admin_views/test_autocomplete_view.py | 2 +-
tests/admin_widgets/test_autocomplete_widget.py | 9 +++++----
5 files changed, 16 insertions(+), 17 deletions(-)
diff --git a/django/contrib/admin/static/admin/js/autocomplete.js b/django/contrib/admin/static/admin/js/autocomplete.js
index 65c0702dd9..10d6e9bb16 100644
--- a/django/contrib/admin/static/admin/js/autocomplete.js
+++ b/django/contrib/admin/static/admin/js/autocomplete.js
@@ -6,7 +6,8 @@
data: function(params) {
return {
term: params.term,
- page: params.page
+ page: params.page,
+ _to_field: $element.data('django-to-field')
};
}
}
diff --git a/django/contrib/admin/views/autocomplete.py b/django/contrib/admin/views/autocomplete.py
index 5d7f64ca13..d22f71a261 100644
--- a/django/contrib/admin/views/autocomplete.py
+++ b/django/contrib/admin/views/autocomplete.py
@@ -25,12 +25,9 @@ class AutocompleteJsonView(BaseListView):
return JsonResponse({'error': '403 Forbidden'}, status=403)
self.term = request.GET.get('term', '')
- self.to_field = request.GET.get('to_field', None)
- if self.to_field:
- if not self.model_admin.to_field_allowed(request, self.to_field):
- raise DisallowedModelAdminToField("The field %s cannot be referenced." % self.to_field)
- else:
- self.to_field = 'pk'
+ self.to_field = request.GET.get('_to_field', self.model_admin.model._meta.pk.name)
+ if not self.model_admin.to_field_allowed(request, self.to_field):
+ raise DisallowedModelAdminToField("The field %s cannot be referenced." % self.to_field)
self.object_list = self.get_queryset()
context = self.get_context_data()
diff --git a/django/contrib/admin/widgets.py b/django/contrib/admin/widgets.py
index ab8354767f..80fbeec6c5 100644
--- a/django/contrib/admin/widgets.py
+++ b/django/contrib/admin/widgets.py
@@ -393,12 +393,11 @@ class AutocompleteMixin:
self.db = using
self.choices = choices
self.attrs = {} if attrs is None else attrs.copy()
- self.to_field = self.rel.field.to_fields[0] if hasattr(self.rel.field, 'to_fields') else None
+ self.to_field = getattr(self.rel, 'field_name', self.rel.model._meta.pk.name)
def get_url(self):
model = self.rel.model
- url = reverse(self.url_name % (self.admin_site.name, model._meta.app_label, model._meta.model_name))
- return url if not self.to_field else url + '?to_field=' + self.to_field
+ return reverse(self.url_name % (self.admin_site.name, model._meta.app_label, model._meta.model_name))
def build_attrs(self, base_attrs, extra_attrs=None):
"""
@@ -418,6 +417,7 @@ class AutocompleteMixin:
'data-theme': 'admin-autocomplete',
'data-allow-clear': json.dumps(not self.is_required),
'data-placeholder': '', # Allows clearing of the input.
+ 'data-django-to-field': self.to_field,
'class': attrs['class'] + (' ' if attrs['class'] else '') + 'admin-autocomplete',
})
return attrs
@@ -434,9 +434,9 @@ class AutocompleteMixin:
if not self.is_required and not self.allow_multiple_selected:
default[1].append(self.create_option(name, '', '', False, 0))
choices = (
- (getattr(obj, self.to_field) if self.to_field else obj.pk, self.choices.field.label_from_instance(obj))
+ (getattr(obj, self.to_field), self.choices.field.label_from_instance(obj))
for obj in self.choices.queryset.using(self.db).filter(**{
- (self.to_field if self.to_field else 'pk') + '__in': selected_choices})
+ f'{self.to_field}__in': selected_choices})
)
for option_value, option_label in choices:
selected = (
diff --git a/tests/admin_views/test_autocomplete_view.py b/tests/admin_views/test_autocomplete_view.py
index ef75523fb0..89dc8e12bd 100644
--- a/tests/admin_views/test_autocomplete_view.py
+++ b/tests/admin_views/test_autocomplete_view.py
@@ -74,7 +74,7 @@ class AutocompleteJsonViewTests(AdminViewBasicTestCase):
# test for `to_field`
fk = ReferencedByParent.objects.create(name='ref by parent')
p = ParentWithFK.objects.create(fk=fk)
- request = self.factory.get(self.url_to_field, {'term': 'by', 'to_field': 'name'})
+ request = self.factory.get(self.url_to_field, {'term': 'by', '_to_field': 'name'})
request.user = self.superuser
response = AutocompleteJsonView.as_view(**self.as_view_args_to_field)(request)
self.assertEqual(response.status_code, 200)
diff --git a/tests/admin_widgets/test_autocomplete_widget.py b/tests/admin_widgets/test_autocomplete_widget.py
index 3631320cff..6c9c3da5d7 100644
--- a/tests/admin_widgets/test_autocomplete_widget.py
+++ b/tests/admin_widgets/test_autocomplete_widget.py
@@ -54,7 +54,8 @@ class AutocompleteMixinTests(TestCase):
'data-ajax--cache': 'true',
'data-ajax--delay': 250,
'data-ajax--type': 'GET',
- 'data-ajax--url': '/admin_widgets/band/autocomplete/?to_field=id',
+ 'data-ajax--url': '/admin_widgets/band/autocomplete/',
+ 'data-django-to-field': 'id',
'data-theme': 'admin-autocomplete',
'data-allow-clear': 'false',
'data-placeholder': ''
@@ -79,13 +80,13 @@ class AutocompleteMixinTests(TestCase):
rel = Album._meta.get_field('band').remote_field
w = AutocompleteSelect(rel, admin.site)
url = w.get_url()
- self.assertEqual(url, '/admin_widgets/band/autocomplete/?to_field=id')
+ self.assertEqual(url, '/admin_widgets/band/autocomplete/')
def test_get_url_to_field(self):
rel = Profile._meta.get_field('user').remote_field
w = AutocompleteSelect(rel, admin.site)
- url = w.get_url()
- self.assertEqual(url, '/auth/user/autocomplete/?to_field=username')
+ attrs = w.build_attrs({})
+ self.assertEqual(attrs['data-django-to-field'], 'username')
def test_render_options(self):
beatles = Band.objects.create(name='The Beatles', style='rock')
--
2.23.0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment