Ticket #11163: 11163.patch.1

File 11163.patch.1, 2.3 KB (added by akaihola, 6 years ago)

Patch against r11173: imitating what RelatedFieldWidgetWrapper does

Line 
1commit 1eadf1be1bf986794961407a26cbe408bcf4af13
2Author: Antti Kaihola <akaihol+django@ambitone.com>
3Date:   Fri Jul 3 14:07:14 2009 +0300
4
5    Fixed #11163 -- Editable raw ID field pop-up link now correct also in admin changelists
6
7diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py
8index 8297eca..e1660a2 100644
9--- a/django/contrib/admin/options.py
10+++ b/django/contrib/admin/options.py
11@@ -139,7 +139,7 @@ class BaseModelAdmin(object):
12         Get a form Field for a ForeignKey.
13         """
14         if db_field.name in self.raw_id_fields:
15-            kwargs['widget'] = widgets.ForeignKeyRawIdWidget(db_field.rel)
16+            kwargs['widget'] = widgets.ForeignKeyRawIdWidget(db_field.rel, self.admin_site)
17         elif db_field.name in self.radio_fields:
18             kwargs['widget'] = widgets.AdminRadioSelect(attrs={
19                 'class': get_ul_class(self.radio_fields[db_field.name]),
20diff --git a/django/contrib/admin/widgets.py b/django/contrib/admin/widgets.py
21index 7ae5e64..960bb3c 100644
22--- a/django/contrib/admin/widgets.py
23+++ b/django/contrib/admin/widgets.py
24@@ -101,14 +101,23 @@ class ForeignKeyRawIdWidget(forms.TextInput):
25     A Widget for displaying ForeignKeys in the "raw_id" interface rather than
26     in a <select> box.
27     """
28-    def __init__(self, rel, attrs=None):
29+    def __init__(self, rel, admin_site, attrs=None):
30         self.rel = rel
31+        self.admin_site = admin_site
32         super(ForeignKeyRawIdWidget, self).__init__(attrs)
33 
34     def render(self, name, value, attrs=None):
35         if attrs is None:
36             attrs = {}
37-        related_url = '../../../%s/%s/' % (self.rel.to._meta.app_label, self.rel.to._meta.object_name.lower())
38+        # TODO: DRY violation, copied code from
39+        # RelatedFieldWidgetWrapper.render() below to fix #11163
40+        rel_to = self.rel.to
41+        info = (rel_to._meta.app_label, rel_to._meta.object_name.lower())
42+        try:
43+            related_info = (self.admin_site.name,) + info
44+            related_url = reverse('%sadmin_%s_%s_changelist' % related_info)
45+        except NoReverseMatch:
46+            related_url = '../../../%s/%s/' % info
47         params = self.url_parameters()
48         if params:
49             url = '?' + '&amp;'.join(['%s=%s' % (k, v) for k, v in params.items()])
Back to Top