Django Администратор: Как настроить ширину autocomplete_fields для адаптации к содержимому? - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь настроить виджет, отображаемый autocomplete_fields для поля модели ForeignKey. В основном проблема в том, что виджет слишком узок для содержимого и разбивается на две строки внутри выбора:

screenshot of current issue

Я видел, что JS Библиотека или плагин JQuery называется Select2 и имеет "dropdownAutoWidth" , чтобы адаптировать его к размеру родительского элемента, что вроде работает, но я совершенно не понимаю, как установить эту опцию из администратора. py, поскольку кажется, что параметры никогда не передаются в коде 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',
            ),
        },
    )

Ответы [ 2 ]

1 голос
/ 30 августа 2020

Django 3.0.9:

forms.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.
                ),
            }

admin.py

from django.contrib import admin

from .forms import MyModelForm


MyModelAdmin(admin.ModelAdmin):
    form = MyModelForm
1 голос
/ 14 мая 2020

Вы можете передать data- * атрибуты в select2, включив их в attrs виджета автозаполнения. Один из способов сделать это - инициализировать виджет самостоятельно, используя настраиваемую форму.

Обратите внимание, что если вы также включите поле в autocomplete_fields, то виджет будет инициализирован вашим экземпляром ModelAdmin и вашей настраиваемой инициализацией не будет иметь никакого эффекта.

Также обратите внимание, что для виджетов AutocompleteSelect и AutocompleteSelectMultiple требуется пара позиционных аргументов.

Должно работать что-то вроде этого:

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 = MyForm
...