#34025: Bug on autocomplete field when two fields from same reference model are
added in same page
-------------------------------------+-------------------------------------
               Reporter:  lexrupy    |          Owner:  nobody
                   Type:  Bug        |         Status:  new
              Component:             |        Version:  4.1
  Uncategorized                      |
               Severity:  Normal     |       Keywords:  admin, autocomplete
           Triage Stage:             |      Has patch:  0
  Unreviewed                         |
    Needs documentation:  0          |    Needs tests:  0
Patch needs improvement:  0          |  Easy pickings:  0
                  UI/UX:  1          |
-------------------------------------+-------------------------------------
 Example of how to reproduce:

 1. create a model Person.

 {{{
 class Person(models.Model):
     name= models.CharField(max_length=255)
 }}}

 2. create a model Order with 2 fks pointing to person, for example:
 supplier and customer


 {{{
 class Order(models.Model):
     supplier = models.ForeignKey(Person, related_name='the_supplier',
 on_delete=models.PROTECT)
     customer = models.ForeignKey(Person, related_name='the_customer',
 on_delete=models.PROTECT)
 }}}

 3. create an admin page for Order.

 4. place the two fields in autocomplete_fields:

 {{{
 class OrderAdmin(admin.ModelAdmin):
     autocomplete_fields = ['supplier', 'customer']
 }}}

 5. do the migration stuff and run the app.

 when create an supplier from + symbol near the supplier, when close the
 window both fields get updated with the ID
 this also occurs when editing.


 ps. I´m not an expert but the code that seems to introduce this bug is on
 commit c72f6f36c13a21f6db3d4f85d2d3cec87bad45e6
 probably on **data-model-ref** tag, since in the page all autocompletes
 have the same **data-model-ref** value, in this example will be "person"

 {{{
 function updateRelatedSelectsOptions(currentSelect, win, objId, newRepr,
 newId) {
         // After create/edit a model from the options next to the current
         // select (+ or :pencil:) update ForeignKey PK of the rest of
 selects
         // in the page.

         const path = win.location.pathname;
         // Extract the model from the popup url '.../<model>/add/' or
         // '.../<model>/<id>/change/' depending the action (add or
 change).
         const modelName = path.split('/')[path.split('/').length - (objId
 ? 4 : 3)];
         const selectsRelated = document.querySelectorAll(`[data-model-
 ref="${modelName}"] select`);

         selectsRelated.forEach(function(select) {
             if (currentSelect === select) {
                 return;
             }

             let option = select.querySelector(`option[value="${objId}"]`);

             if (!option) {
                 option = new Option(newRepr, newId);
                 select.options.add(option);
                 return;
             }

             option.textContent = newRepr;
             option.value = newId;
         });
     }
 }}}

-- 
Ticket URL: <https://code.djangoproject.com/ticket/34025>
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/010701835c9b2ea0-cc00acea-1051-41ab-84a8-c03e25b7879a-000000%40eu-central-1.amazonses.com.

Reply via email to