Django admin - использование автозаполнения и фильтра по полям выбора (не ManyToMany или ForeignKey)

Это моя модель:

class Academic(models.Model):

SCHOOL_COLLEGE_SERVICE = [
    ('School Of Humanities', 'School Of Humanities'),
    ('School Of Culture & Creative Arts', 'School Of Culture & Creative Arts'),
    ('School Of Modern Languages & Cultures', 'School Of Modern Languages & Cultures'),
    ('School Of Critical Studies', 'School Of Critical Studies'),
    ('Arts  College Of Arts Administration', 'Arts  College Of Arts Administration'),
    ]

school = models.CharField(choices=SCHOOL_COLLEGE_SERVICE, max_length=50, blank=True, null=True)

Я хотел бы иметь хороший автозаполнитель / фильтр в моем административном интерфейсе Django. К сожалению, кажется, что невозможно иметь автозаполнение, если набор данных не происходит из отношения ManyToMany или ForeignKey. Вот что я пробовал:

from django.contrib import admin
from .models import Academic, Partner, Project
from admin_auto_filters.filters import AutocompleteFilter
import django_filters

@admin.register(Academic)
class AcademicAdmin(admin.ModelAdmin):
    search_fields = ['surname', 'forename']
    #school = django_filters.ChoiceFilter(choices=Academic.SCHOOL_COLLEGE_SERVICE)
    #autocomplete_fields = ['school']

Я знаю, что могу также установить queryset следующим образом:

class SchoolFilter(django_filters.FilterSet):
    class Meta:
        model = Academic
        fields = ['school',]

Но Django все еще жалуется, что The value of 'autocomplete_fields[0]' must be a foreign key or a many-to-many field. Как я могу достичь того, что я хочу?

Вы можете легко сделать форму choicefield в качестве выпадающего автозаполнения, используя пакет django-autocomplete-light. Этот пакет также поддерживает queryset.

В файле forms.py,

class AcademicForm(forms.ModelForm):
    SCHOOL_COLLEGE_SERVICE = [
        ('School Of Humanities', 'School Of Humanities'),
        ('School Of Culture & Creative Arts', 'School Of Culture & Creative Arts'),
        ('School Of Modern Languages & Cultures', 'School Of Modern Languages & Cultures'),
        ('School Of Critical Studies', 'School Of Critical Studies'),
        ('Arts  College Of Arts Administration', 'Arts  College Of Arts Administration'),
    ]
    school = forms.ChoiceField(choices=SCHOOL_COLLEGE_SERVICE,
                               widget=autocomplete.ListSelect2(url='school_autocomplete'))
    
    class Meta:
        model = Academic
        fields = ['school', 'other_your_model_field_list']

В urls.py,

urlpatterns = [
    path('school-autocomplete', SchoolAutocompleteView.as_view(), name='school_autocomplete'),
    ]

В файле views.py,

from dal import autocomplete

class SchoolAutocompleteView(autocomplete.Select2ListView):

    def get_list(self):
        if not self.request.user.is_authenticated:
            return []

        SCHOOL_COLLEGE_SERVICE = ['School Of Humanities',
                                  'School Of Culture & Creative Arts',
                                  'School Of Modern Languages & Cultures',
                                  'School Of Critical Studies',
                                  'Arts  College Of Arts Administration']

        return SCHOOL_COLLEGE_SERVICE

Теперь вы используете modelform в своем классе администратора,

@admin.register(Academic)
class AcademicAdmin(admin.ModelAdmin):
    form = AcademicForm
    ....
    ....

для более подробной информации, doc_link- https://django-autocomplete-light.readthedocs.io/en/master/tutorial.html

Вернуться на верх