diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py
index 1f8ff6d..7a4f814 100644
|
a
|
b
|
class ModelAdmin(BaseModelAdmin):
|
| 1081 | 1081 | 'actions_on_top': self.actions_on_top, |
| 1082 | 1082 | 'actions_on_bottom': self.actions_on_bottom, |
| 1083 | 1083 | 'actions_selection_counter': self.actions_selection_counter, |
| | 1084 | 'request': request, |
| 1084 | 1085 | } |
| 1085 | 1086 | context.update(extra_context or {}) |
| 1086 | 1087 | context_instance = template.RequestContext(request, current_app=self.admin_site.name) |
diff --git a/django/contrib/admin/templates/admin/change_list.html b/django/contrib/admin/templates/admin/change_list.html
index 3b037e5..f319c95 100644
|
a
|
b
|
|
| 92 | 92 | |
| 93 | 93 | {% block result_list %} |
| 94 | 94 | {% if action_form and actions_on_top and cl.full_result_count %}{% admin_actions %}{% endif %} |
| 95 | | {% result_list cl %} |
| | 95 | {% result_list request cl %} |
| 96 | 96 | {% if action_form and actions_on_bottom and cl.full_result_count %}{% admin_actions %}{% endif %} |
| 97 | 97 | {% endblock %} |
| 98 | 98 | {% block pagination %}{% pagination cl %}{% endblock %} |
diff --git a/django/contrib/admin/templatetags/admin_list.py b/django/contrib/admin/templatetags/admin_list.py
index 565db32..32b5940 100644
|
a
|
b
|
def _boolean_icon(field_val):
|
| 126 | 126 | BOOLEAN_MAPPING = {True: 'yes', False: 'no', None: 'unknown'} |
| 127 | 127 | return mark_safe(u'<img src="%simg/admin/icon-%s.gif" alt="%s" />' % (settings.ADMIN_MEDIA_PREFIX, BOOLEAN_MAPPING[field_val], field_val)) |
| 128 | 128 | |
| 129 | | def items_for_result(cl, result, form): |
| | 129 | def items_for_result(request, cl, result, form): |
| 130 | 130 | """ |
| 131 | 131 | Generates the actual list of data. |
| 132 | 132 | """ |
| … |
… |
def items_for_result(cl, result, form):
|
| 135 | 135 | for field_name in cl.list_display: |
| 136 | 136 | row_class = '' |
| 137 | 137 | try: |
| 138 | | f, attr, value = lookup_field(field_name, result, cl.model_admin) |
| | 138 | f, attr, value = lookup_field(field_name, result, cl.model_admin, request) |
| 139 | 139 | except (AttributeError, ObjectDoesNotExist): |
| 140 | 140 | result_repr = EMPTY_CHANGELIST_VALUE |
| 141 | 141 | else: |
| … |
… |
def items_for_result(cl, result, form):
|
| 192 | 192 | if form: |
| 193 | 193 | yield mark_safe(u'<td>%s</td>' % force_unicode(form[cl.model._meta.pk.name])) |
| 194 | 194 | |
| 195 | | def results(cl): |
| | 195 | def results(request, cl): |
| 196 | 196 | if cl.formset: |
| 197 | 197 | for res, form in zip(cl.result_list, cl.formset.forms): |
| 198 | | yield list(items_for_result(cl, res, form)) |
| | 198 | yield list(items_for_result(request, cl, res, form)) |
| 199 | 199 | else: |
| 200 | 200 | for res in cl.result_list: |
| 201 | | yield list(items_for_result(cl, res, None)) |
| | 201 | yield list(items_for_result(request, cl, res, None)) |
| 202 | 202 | |
| 203 | | def result_list(cl): |
| | 203 | def result_list(request, cl): |
| 204 | 204 | """ |
| 205 | 205 | Displays the headers and data list together |
| 206 | 206 | """ |
| 207 | 207 | return {'cl': cl, |
| 208 | 208 | 'result_headers': list(result_headers(cl)), |
| 209 | | 'results': list(results(cl))} |
| | 209 | 'results': list(results(request, cl))} |
| 210 | 210 | result_list = register.inclusion_tag("admin/change_list_results.html")(result_list) |
| 211 | 211 | |
| 212 | 212 | def date_hierarchy(cl): |
diff --git a/django/contrib/admin/util.py b/django/contrib/admin/util.py
index 776a6f0..97393f8 100644
|
a
|
b
|
def model_ngettext(obj, n=None):
|
| 250 | 250 | singular, plural = d["verbose_name"], d["verbose_name_plural"] |
| 251 | 251 | return ungettext(singular, plural, n or 0) |
| 252 | 252 | |
| 253 | | def lookup_field(name, obj, model_admin=None): |
| | 253 | def lookup_field(name, obj, model_admin=None, request=None): |
| 254 | 254 | opts = obj._meta |
| 255 | 255 | try: |
| 256 | 256 | f = opts.get_field(name) |
| … |
… |
def lookup_field(name, obj, model_admin=None):
|
| 258 | 258 | # For non-field values, the value is either a method, property or |
| 259 | 259 | # returned via a callable. |
| 260 | 260 | if callable(name): |
| 261 | | attr = name |
| 262 | | value = attr(obj) |
| | 261 | attr = func = name |
| 263 | 262 | elif (model_admin is not None and hasattr(model_admin, name) and |
| 264 | 263 | not name == '__str__' and not name == '__unicode__'): |
| 265 | | attr = getattr(model_admin, name) |
| 266 | | value = attr(obj) |
| | 264 | attr = func = getattr(model_admin, name) |
| 267 | 265 | else: |
| 268 | 266 | attr = getattr(obj, name) |
| 269 | 267 | if callable(attr): |
| 270 | | value = attr() |
| | 268 | func = getattr(obj.__class__, name) |
| 271 | 269 | else: |
| 272 | | value = attr |
| | 270 | def func(*args): return attr |
| | 271 | |
| | 272 | if getattr(attr, 'accepts_request', False): |
| | 273 | value = func(obj, request) |
| | 274 | else: |
| | 275 | value = func(obj) |
| | 276 | |
| 273 | 277 | f = None |
| 274 | 278 | else: |
| 275 | 279 | attr = None |
diff --git a/tests/regressiontests/admin_changelist/tests.py b/tests/regressiontests/admin_changelist/tests.py
index b70d7c5..3bc0d92 100644
|
a
|
b
|
class ChangeListTests(unittest.TestCase):
|
| 31 | 31 | m.list_select_related, m.list_per_page, m.list_editable, m) |
| 32 | 32 | FormSet = m.get_changelist_formset(request) |
| 33 | 33 | cl.formset = FormSet(queryset=cl.result_list) |
| 34 | | template = Template('{% load admin_list %}{% spaceless %}{% result_list cl %}{% endspaceless %}') |
| 35 | | context = Context({'cl': cl}) |
| | 34 | template = Template('{% load admin_list %}{% spaceless %}{% result_list request cl %}{% endspaceless %}') |
| | 35 | context = Context({'request': request, 'cl': cl}) |
| 36 | 36 | table_output = template.render(context) |
| 37 | 37 | hidden_input_elem = '<input type="hidden" name="form-0-id" value="1" id="id_form-0-id" />' |
| 38 | 38 | self.failIf(table_output.find(hidden_input_elem) == -1, |
| … |
… |
class ChangeListTests(unittest.TestCase):
|
| 49 | 49 | m.list_select_related, m.list_per_page, m.list_editable, m) |
| 50 | 50 | FormSet = m.get_changelist_formset(request) |
| 51 | 51 | cl.formset = FormSet(queryset=cl.result_list) |
| 52 | | template = Template('{% load admin_list %}{% spaceless %}{% result_list cl %}{% endspaceless %}') |
| 53 | | context = Context({'cl': cl}) |
| | 52 | template = Template('{% load admin_list %}{% spaceless %}{% result_list request cl %}{% endspaceless %}') |
| | 53 | context = Context({'request': request, 'cl': cl}) |
| 54 | 54 | table_output = template.render(context) |
| 55 | 55 | self.failIf(table_output.find(hidden_input_elem) == -1, |
| 56 | 56 | 'Failed to find expected hidden input element in: %s' % table_output) |
diff --git a/tests/regressiontests/admin_util/tests.py b/tests/regressiontests/admin_util/tests.py
index 5ea0ac5..b118742 100644
|
a
|
b
|
class UtilTests(unittest.TestCase):
|
| 83 | 83 | def get_admin_value(self, obj): |
| 84 | 84 | return ADMIN_METHOD |
| 85 | 85 | |
| | 86 | class MockRequest(object): |
| | 87 | pass |
| | 88 | |
| 86 | 89 | simple_function = lambda obj: SIMPLE_FUNCTION |
| 87 | 90 | |
| | 91 | request_function = lambda obj, req: repr(req) |
| | 92 | request_function.accepts_request = True |
| | 93 | |
| | 94 | request = MockRequest() |
| | 95 | |
| 88 | 96 | article = Article( |
| 89 | 97 | site=Site(domain=SITE_NAME), |
| 90 | 98 | title=TITLE_TEXT, |
| … |
… |
class UtilTests(unittest.TestCase):
|
| 98 | 106 | ('title', TITLE_TEXT), |
| 99 | 107 | ('get_admin_value', ADMIN_METHOD), |
| 100 | 108 | (simple_function, SIMPLE_FUNCTION), |
| | 109 | (request_function, repr(request)), |
| 101 | 110 | ('test_from_model', article.test_from_model()), |
| 102 | 111 | ('non_field', INSTANCE_ATTRIBUTE) |
| 103 | 112 | ) |
| 104 | 113 | |
| 105 | 114 | mock_admin = MockModelAdmin() |
| 106 | 115 | for name, value in verifications: |
| 107 | | field, attr, resolved_value = lookup_field(name, article, mock_admin) |
| | 116 | field, attr, resolved_value = lookup_field(name, article, mock_admin, request) |
| 108 | 117 | |
| 109 | 118 | if field is not None: |
| 110 | 119 | resolved_value = display_for_field(resolved_value, field) |