#32628: Add extra data to autocomplete request
------------------------------------------------+------------------------
               Reporter:  Seb G                 |          Owner:  nobody
                   Type:  Cleanup/optimization  |         Status:  new
              Component:  contrib.admin         |        Version:  3.2
               Severity:  Normal                |       Keywords:
           Triage Stage:  Unreviewed            |      Has patch:  0
    Needs documentation:  0                     |    Needs tests:  0
Patch needs improvement:  0                     |  Easy pickings:  0
                  UI/UX:  0                     |
------------------------------------------------+------------------------
 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"});
 }}}

-- 
Ticket URL: <https://code.djangoproject.com/ticket/32628>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/049.66924cb4e5bace1c07c91b1bc154dbf3%40djangoproject.com.

Reply via email to