diff options
Diffstat (limited to 'django')
| -rw-r--r-- | django/contrib/admin/options.py | 18 | ||||
| -rw-r--r-- | django/contrib/admin/templates/admin/change_form.html | 3 | ||||
| -rw-r--r-- | django/contrib/admin/templates/admin/change_list.html | 2 | ||||
| -rw-r--r-- | django/contrib/admin/templates/admin/popup_response.html | 2 | ||||
| -rw-r--r-- | django/contrib/admin/templatetags/admin_urls.py | 5 | ||||
| -rw-r--r-- | django/contrib/admin/views/main.py | 3 | ||||
| -rw-r--r-- | django/contrib/admin/widgets.py | 6 |
7 files changed, 29 insertions, 10 deletions
diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py index 72c3635b52..f53d655bfc 100644 --- a/django/contrib/admin/options.py +++ b/django/contrib/admin/options.py @@ -44,6 +44,7 @@ from django.views.decorators.csrf import csrf_protect IS_POPUP_VAR = '_popup' +TO_FIELD_VAR = '_to_field' HORIZONTAL, VERTICAL = 1, 2 # returns the <ul> class for a given radio_admin field @@ -932,6 +933,8 @@ class ModelAdmin(BaseModelAdmin): 'content_type_id': ContentType.objects.get_for_model(self.model).id, 'save_as': self.save_as, 'save_on_top': self.save_on_top, + 'to_field_var': TO_FIELD_VAR, + 'is_popup_var': IS_POPUP_VAR }) if add and self.add_form_template is not None: form_template = self.add_form_template @@ -951,13 +954,20 @@ class ModelAdmin(BaseModelAdmin): opts = obj._meta pk_value = obj._get_pk_val() preserved_filters = self.get_preserved_filters(request) - msg_dict = {'name': force_text(opts.verbose_name), 'obj': force_text(obj)} # Here, we distinguish between different save types by checking for # the presence of keys in request.POST. + if IS_POPUP_VAR in request.POST: + to_field = request.POST.get(TO_FIELD_VAR) + if to_field: + attr = str(to_field) + else: + attr = obj._meta.pk.attname + value = obj.serializable_value(attr) return SimpleTemplateResponse('admin/popup_response.html', { - 'pk_value': escape(pk_value), + 'pk_value': escape(pk_value), # for possible backwards-compatibility + 'value': escape(value), 'obj': escapejs(obj) }) @@ -988,6 +998,7 @@ class ModelAdmin(BaseModelAdmin): """ Determines the HttpResponse for the change_view stage. """ + opts = self.model._meta pk_value = obj._get_pk_val() preserved_filters = self.get_preserved_filters(request) @@ -1224,6 +1235,7 @@ class ModelAdmin(BaseModelAdmin): title=_('Add %s') % force_text(opts.verbose_name), adminform=adminForm, is_popup=IS_POPUP_VAR in request.REQUEST, + to_field=request.REQUEST.get(TO_FIELD_VAR), media=media, inline_admin_formsets=inline_admin_formsets, errors=helpers.AdminErrorList(form, formsets), @@ -1297,6 +1309,7 @@ class ModelAdmin(BaseModelAdmin): object_id=object_id, original=obj, is_popup=IS_POPUP_VAR in request.REQUEST, + to_field=request.REQUEST.get(TO_FIELD_VAR), media=media, inline_admin_formsets=inline_admin_formsets, errors=helpers.AdminErrorList(form, formsets), @@ -1443,6 +1456,7 @@ class ModelAdmin(BaseModelAdmin): selection_note_all=selection_note_all % {'total_count': cl.result_count}, title=cl.title, is_popup=cl.is_popup, + to_field=cl.to_field, cl=cl, media=media, has_add_permission=self.has_add_permission(request), diff --git a/django/contrib/admin/templates/admin/change_form.html b/django/contrib/admin/templates/admin/change_form.html index c6969f6cc8..1acfcd37db 100644 --- a/django/contrib/admin/templates/admin/change_form.html +++ b/django/contrib/admin/templates/admin/change_form.html @@ -39,7 +39,8 @@ {% endblock %} <form {% if has_file_field %}enctype="multipart/form-data" {% endif %}action="{{ form_url }}" method="post" id="{{ opts.model_name }}_form">{% csrf_token %}{% block form_top %}{% endblock %} <div> -{% if is_popup %}<input type="hidden" name="_popup" value="1" />{% endif %} +{% if is_popup %}<input type="hidden" name="{{ is_popup_var }}" value="1" />{% endif %} +{% if to_field %}<input type="hidden" name="{{ to_field_var }}" value="{{ to_field }}" />{% endif %} {% if save_on_top %}{% block submit_buttons_top %}{% submit_row %}{% endblock %}{% endif %} {% if errors %} <p class="errornote"> diff --git a/django/contrib/admin/templates/admin/change_list.html b/django/contrib/admin/templates/admin/change_list.html index ce5c5b37a4..a5a31f9c67 100644 --- a/django/contrib/admin/templates/admin/change_list.html +++ b/django/contrib/admin/templates/admin/change_list.html @@ -54,7 +54,7 @@ {% block object-tools-items %} <li> {% url cl.opts|admin_urlname:'add' as add_url %} - <a href="{% add_preserved_filters add_url is_popup %}" class="addlink"> + <a href="{% add_preserved_filters add_url is_popup to_field %}" class="addlink"> {% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %} </a> </li> diff --git a/django/contrib/admin/templates/admin/popup_response.html b/django/contrib/admin/templates/admin/popup_response.html index 44833b2f93..281f0354ee 100644 --- a/django/contrib/admin/templates/admin/popup_response.html +++ b/django/contrib/admin/templates/admin/popup_response.html @@ -3,7 +3,7 @@ <head><title></title></head> <body> <script type="text/javascript"> - opener.dismissAddAnotherPopup(window, "{{ pk_value }}", "{{ obj }}"); + opener.dismissAddAnotherPopup(window, "{{ value }}", "{{ obj }}"); </script> </body> </html> diff --git a/django/contrib/admin/templatetags/admin_urls.py b/django/contrib/admin/templatetags/admin_urls.py index 5d9c5b5427..fd45bf306a 100644 --- a/django/contrib/admin/templatetags/admin_urls.py +++ b/django/contrib/admin/templatetags/admin_urls.py @@ -22,7 +22,7 @@ def admin_urlquote(value): @register.simple_tag(takes_context=True) -def add_preserved_filters(context, url, popup=False): +def add_preserved_filters(context, url, popup=False, to_field=None): opts = context.get('opts') preserved_filters = context.get('preserved_filters') @@ -48,6 +48,9 @@ def add_preserved_filters(context, url, popup=False): if popup: from django.contrib.admin.options import IS_POPUP_VAR merged_qs[IS_POPUP_VAR] = 1 + if to_field: + from django.contrib.admin.options import TO_FIELD_VAR + merged_qs[TO_FIELD_VAR] = to_field merged_qs.update(parsed_qs) diff --git a/django/contrib/admin/views/main.py b/django/contrib/admin/views/main.py index 3325747a9f..14f7655251 100644 --- a/django/contrib/admin/views/main.py +++ b/django/contrib/admin/views/main.py @@ -15,7 +15,7 @@ from django.utils.http import urlencode from django.contrib.admin import FieldListFilter from django.contrib.admin.exceptions import DisallowedModelAdminLookup -from django.contrib.admin.options import IncorrectLookupParameters, IS_POPUP_VAR +from django.contrib.admin.options import IncorrectLookupParameters, IS_POPUP_VAR, TO_FIELD_VAR from django.contrib.admin.util import (quote, get_fields_from_path, lookup_needs_distinct, prepare_lookup_value) @@ -25,7 +25,6 @@ ORDER_VAR = 'o' ORDER_TYPE_VAR = 'ot' PAGE_VAR = 'p' SEARCH_VAR = 'q' -TO_FIELD_VAR = 't' ERROR_FLAG = 'e' IGNORED_PARAMS = ( diff --git a/django/contrib/admin/widgets.py b/django/contrib/admin/widgets.py index e5b590e0d0..fe6c9e13a9 100644 --- a/django/contrib/admin/widgets.py +++ b/django/contrib/admin/widgets.py @@ -248,16 +248,18 @@ class RelatedFieldWidgetWrapper(forms.Widget): return self.widget.media def render(self, name, value, *args, **kwargs): + from django.contrib.admin.views.main import TO_FIELD_VAR rel_to = self.rel.to info = (rel_to._meta.app_label, rel_to._meta.model_name) self.widget.choices = self.choices output = [self.widget.render(name, value, *args, **kwargs)] if self.can_add_related: related_url = reverse('admin:%s_%s_add' % info, current_app=self.admin_site.name) + url_params = '?%s=%s' % (TO_FIELD_VAR, self.rel.get_related_field().name) # TODO: "add_id_" is hard-coded here. This should instead use the # correct API to determine the ID dynamically. - output.append('<a href="%s" class="add-another" id="add_id_%s" onclick="return showAddAnotherPopup(this);"> ' - % (related_url, name)) + output.append('<a href="%s%s" class="add-another" id="add_id_%s" onclick="return showAddAnotherPopup(this);"> ' + % (related_url, url_params, name)) output.append('<img src="%s" width="10" height="10" alt="%s"/></a>' % (static('admin/img/icon_addlink.gif'), _('Add Another'))) return mark_safe(''.join(output)) |
