Last active
October 31, 2019 05:27
-
-
Save codingjoe/5c5ef8087f8d71dbd4b4373bbc39ffaa to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From a7e3b566f5cfdc8a8685cb38e3709c46c42fcb9d Mon Sep 17 00:00:00 2001 | |
From: Johannes Hoppe <[email protected]> | |
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