Opened 3 years ago
Last modified 3 years ago
#34025 closed Bug
Bug on autocomplete field when two fields from same reference model are added in same page — at Version 1
| Reported by: | Alexandre da Silva | Owned by: | nobody |
|---|---|---|---|
| Component: | contrib.admin | Version: | 4.1 |
| Severity: | Release blocker | Keywords: | admin, autocomplete |
| Cc: | Marcelo Galigniana | Triage Stage: | Ready for checkin |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | yes |
Description (last modified by )
Example of how to reproduce:
- create a model Person.
- create a model Order with 2 fks pointing to person, for example: supplier and customer
from django.db import models
# Create your models here.
class Person(models.Model):
name = models.CharField(max_length=255)
def __str__(self):
return self.name
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)
- create an admin page for Order.
- place the two fields in autocomplete_fields:
from django.contrib import admin
from sales.models import *
class PersonAdmin(admin.ModelAdmin):
search_fields = ['name']
class OrderAdmin(admin.ModelAdmin):
autocomplete_fields = ['supplier', 'customer']
admin.site.register(Person, PersonAdmin)
admin.site.register(Order, OrderAdmin)
- 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;
});
}
Note:
See TracTickets
for help on using tickets.