Estoy tratando de personalizar el widget representado por autocomplete_fields para un campo Modelo ForeignKey. Básicamente, el problema es que el widget es demasiado estrecho para el contenido y se divide en dos líneas dentro de la selección:
He visto que la biblioteca JS o el complemento JQuery se llama Select2 y tiene un "desplegableAutoWidth" para que se adapte al tamaño del elemento principal que funciona, pero no tengo ni idea de cómo configurar esa opción desde admin.py desde parece que las opciones nunca se pasan en el código en django.contrib.admin.widgets.AutocompleteMixin.media:
def media(self): extra = '' if settings.DEBUG else '.min' i18n_name = SELECT2_TRANSLATIONS.get(get_language()) i18n_file = ('admin/js/vendor/select2/i18n/%s.js' % i18n_name,) if i18n_name else () return forms.Media( js=( 'admin/js/vendor/jquery/jquery%s.js' % extra, 'admin/js/vendor/select2/select2.full%s.js' % extra, ) + i18n_file + ( 'admin/js/jquery.init.js', 'admin/js/autocomplete.js', ), css={ 'screen': ( 'admin/css/vendor/select2/select2%s.css' % extra, 'admin/css/autocomplete.css', ), }, )Puede pasar atributos data-* a select2 incluyéndolos en los attrs del widget de autocompletar. Una forma de hacerlo es inicializar el widget usted mismo mediante un formulario personalizado.
Tenga en cuenta que si también incluye el campo en autocomplete_fields , su instancia de ModelAdmin inicializará el widget y su inicialización personalizada no tendrá ningún efecto.
También tenga en cuenta que los widgets AutocompleteSelect y AutocompleteSelectMultiple requieren un par de argumentos posicionales.
Algo como esto debería funcionar:
from django import forms from django.contrib import admin from django.contrib.admin.widgets import AutocompleteSelect class MyForm(forms.ModelForm): class Meta: widgets = { 'my_field': AutocompleteSelect( MyModel._meta.get_field('my_field').remote_field, admin.site, attrs={'data-dropdown-auto-width': 'true'} ), } class MyAdmin(admin.ModelAdmin): #autocomplete_fields = ['my_field'] form = MyFormDjango 3.0.9:
formularios.py
from django import forms from django.contrib import admin from django.contrib.admin.widgets import AutocompleteSelect from .models import MyModel class MyModelForm(forms.ModelForm): class Meta: fields = ('my_field', ) widgets = { 'my_field': AutocompleteSelect( MyModel.my_field.field.remote_field, admin.site, attrs={'style': 'width: 400px'} # You can put any width you want. ), }administrador.py
from django.contrib import admin from .forms import MyModelForm MyModelAdmin(admin.ModelAdmin): form = MyModelForm