summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCollin Anderson <cmawebsite@gmail.com>2017-02-20 08:48:03 -0500
committerTim Graham <timograham@gmail.com>2017-02-20 08:48:17 -0500
commit808d33c1bf15e6fba38b361e47c60a0b8208b2e0 (patch)
tree910f58bfd825b66a021fdfd76442b195e5628d23
parent447c6802f0a19d62026f2a8c84a479377ce80b20 (diff)
[1.11.x] Fixed #27850 -- Made RelatedFieldWidgetWrapper call render() of the wrapped widget.
Backport of fb7e0e01af5364987de7fc95ae4d66e22130f2bc from master
-rw-r--r--django/contrib/admin/templates/admin/widgets/related_widget_wrapper.html8
-rw-r--r--django/contrib/admin/widgets.py12
-rw-r--r--django/forms/widgets.py8
-rw-r--r--tests/admin_widgets/tests.py16
4 files changed, 27 insertions, 17 deletions
diff --git a/django/contrib/admin/templates/admin/widgets/related_widget_wrapper.html b/django/contrib/admin/templates/admin/widgets/related_widget_wrapper.html
index b6a4436953..b84ab14cca 100644
--- a/django/contrib/admin/templates/admin/widgets/related_widget_wrapper.html
+++ b/django/contrib/admin/templates/admin/widgets/related_widget_wrapper.html
@@ -1,24 +1,24 @@
{% load i18n static %}
<div class="related-widget-wrapper">
- {% include widget.template_name %}
+ {{ rendered_widget }}
{% block links %}
{% spaceless %}
{% if can_change_related %}
- <a class="related-widget-wrapper-link change-related" id="change_id_{{ widget.name }}"
+ <a class="related-widget-wrapper-link change-related" id="change_id_{{ name }}"
data-href-template="{{ change_related_template_url }}?{{ url_params }}"
title="{% blocktrans %}Change selected {{ model }}{% endblocktrans %}">
<img src="{% static 'admin/img/icon-changelink.svg' %}" alt="{% trans 'Change' %}"/>
</a>
{% endif %}
{% if can_add_related %}
- <a class="related-widget-wrapper-link add-related" id="add_id_{{ widget.name }}"
+ <a class="related-widget-wrapper-link add-related" id="add_id_{{ name }}"
href="{{ add_related_url }}?{{ url_params }}"
title="{% blocktrans %}Add another {{ model }}{% endblocktrans %}">
<img src="{% static 'admin/img/icon-addlink.svg' %}" alt="{% trans 'Add' %}"/>
</a>
{% endif %}
{% if can_delete_related %}
- <a class="related-widget-wrapper-link delete-related" id="delete_id_{{ widget.name }}"
+ <a class="related-widget-wrapper-link delete-related" id="delete_id_{{ name }}"
data-href-template="{{ delete_related_template_url }}?{{ url_params }}"
title="{% blocktrans %}Delete selected {{ model }}{% endblocktrans %}">
<img src="{% static 'admin/img/icon-deletelink.svg' %}" alt="{% trans 'Delete' %}"/>
diff --git a/django/contrib/admin/widgets.py b/django/contrib/admin/widgets.py
index 5960f82d91..39a906ed85 100644
--- a/django/contrib/admin/widgets.py
+++ b/django/contrib/admin/widgets.py
@@ -269,18 +269,20 @@ class RelatedFieldWidgetWrapper(forms.Widget):
current_app=self.admin_site.name, args=args)
def get_context(self, name, value, attrs=None):
- with self.widget.override_choices(self.choices):
- context = self.widget.get_context(name, value, attrs)
-
from django.contrib.admin.views.main import IS_POPUP_VAR, TO_FIELD_VAR
rel_opts = self.rel.model._meta
info = (rel_opts.app_label, rel_opts.model_name)
+ self.widget.choices = self.choices
url_params = '&'.join("%s=%s" % param for param in [
(TO_FIELD_VAR, self.rel.get_related_field().name),
(IS_POPUP_VAR, 1),
])
- context['url_params'] = url_params
- context['model'] = rel_opts.verbose_name
+ context = {
+ 'rendered_widget': self.widget.render(name, value, attrs),
+ 'name': name,
+ 'url_params': url_params,
+ 'model': rel_opts.verbose_name,
+ }
if self.can_change_related:
change_related_template_url = self.get_related_url(info, 'change', '__fk__')
context.update(
diff --git a/django/forms/widgets.py b/django/forms/widgets.py
index aca599ff9a..82efdef633 100644
--- a/django/forms/widgets.py
+++ b/django/forms/widgets.py
@@ -7,7 +7,6 @@ from __future__ import unicode_literals
import copy
import datetime
import re
-from contextlib import contextmanager
from itertools import chain
from django.conf import settings
@@ -647,13 +646,6 @@ class ChoiceWidget(Widget):
pass
return getter(name)
- @contextmanager
- def override_choices(self, choices):
- old = self.choices
- self.choices = choices
- yield
- self.choices = old
-
def format_value(self, value):
"""Return selected values as a set."""
if not isinstance(value, (tuple, list)):
diff --git a/tests/admin_widgets/tests.py b/tests/admin_widgets/tests.py
index b74df4e251..8c05fa4331 100644
--- a/tests/admin_widgets/tests.py
+++ b/tests/admin_widgets/tests.py
@@ -599,6 +599,7 @@ class ManyToManyRawIdWidgetTest(TestCase):
)
+@override_settings(ROOT_URLCONF='admin_widgets.urls')
class RelatedFieldWidgetWrapperTests(SimpleTestCase):
def test_no_can_add_related(self):
rel = Individual._meta.get_field('parent').remote_field
@@ -633,6 +634,21 @@ class RelatedFieldWidgetWrapperTests(SimpleTestCase):
self.assertTrue(wrapper.can_change_related)
self.assertFalse(wrapper.can_delete_related)
+ def test_custom_widget_render(self):
+ class CustomWidget(forms.Select):
+ def render(self, *args, **kwargs):
+ return 'custom render output'
+ rel = Album._meta.get_field('band').remote_field
+ widget = CustomWidget()
+ wrapper = widgets.RelatedFieldWidgetWrapper(
+ widget, rel, widget_admin_site,
+ can_add_related=True,
+ can_change_related=True,
+ can_delete_related=True,
+ )
+ output = wrapper.render('name', 'value')
+ self.assertIn('custom render output', output)
+
@override_settings(ROOT_URLCONF='admin_widgets.urls')
class AdminWidgetSeleniumTestCase(AdminSeleniumTestCase):