﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
32628	Add extra data to autocomplete request	Seb G	nobody	"More often than not, I need to add extra parameters to requests sent by autocomplete widgets from admin forms. Currently I have 2 options to do so:

1. Listen to opening/closing Select2 events to add headers to the request:

{{{#!javascript
$(document).on(""select2:opening"", ""#foo_set-group select.admin-autocomplete"", function () {
    $.ajaxSetup({headers: {""X-Foo"": ""bar""}});
  }
).on(""select2:closing"", ""#foo_set-group select.admin-autocomplete"", function () {
    delete $.ajaxSettings.headers[""X-Foo""];
  }
);
}}}

2. Destroy the widget and rebuild it using `$.fn.djangoAdminSelect2` to hack my extra parameters next to the other expected GET parameters:

{{{#!python
let $select = $(""#id_my_field"");
$select.select2(""destroy"").djangoAdminSelect2({
  ajax: {
    data: function (params) {
      return {
        term: params.term
        page: params.page
        app_label: $select.data(""app-label""),
        model_name: $select.data(""model-name""),
        field_name: $select.data(""field-name"")
        foo: ""bar""
      }
    }
  }
});
}}}

None of these solutions look clean to me, and I would definitely like to have the ability to add extra parameters to `$.fn.djangoAdminSelect2` properly as follows:

- `autocomplete.js`:

{{{#!javascript
'use strict';
{
    const $ = django.jQuery;
    const init = function($element, options, extraParams) {
        const settings = $.extend({
            ajax: {
                data: function(params) {
                    let defaultParams = {
                        term: params.term,
                        page: params.page,
                        app_label: $element.data('app-label'),
                        model_name: $element.data('model-name'),
                        field_name: $element.data('field-name')
                    };
                    return $.extend(defaultParams, extraParams)
                }
            }
        }, options);
        $element.select2(settings);
    };

    $.fn.djangoAdminSelect2 = function(options, extraParams) {
        const settings = $.extend({}, options);
        $.each(this, function(i, element) {
            const $element = $(element);
            init($element, settings, extraParams);
        });
        return this;
    };

    $(function() {
        // Initialize all autocomplete widgets except the one in the template
        // form used when a new formset is added.
        $('.admin-autocomplete').not('[name*=__prefix__]').djangoAdminSelect2();
    });

    $(document).on('formset:added', (function() {
        return function(event, $newFormset) {
            return $newFormset.find('.admin-autocomplete').djangoAdminSelect2();
        };
    })(this));
}
}}}

- `consumer_script.js`:


{{{#!javascript
$select = $(""#id_my_field"");
$select.select2(""destroy"").djangoAdminSelect2({}, {foo: ""bar""});
}}}"	New feature	closed	contrib.admin	3.2	Normal	wontfix		Johannes Maron	Unreviewed	0	0	0	0	0	0
