Django как автозаполнить поле ввода ForeignKey с помощью Crispy Forms

Обращаюсь за любой помощью, так как не могу разобраться с этим. У меня есть поле 'category', которое содержит около 4000 категорий, взятых из моей таблицы "Category". Когда пользователь вводит свои данные, он выбирает из поля категории. Оно отлично работает как выпадающий список, но прокрутка занимает целую вечность. Я бы предпочел, чтобы поле было текстовым, и когда пользователь начинает вводить, например, "слива", в списке появляются все категории, в которых есть "слива", чтобы он мог выбрать. Они также должны выбирать из списка и не вводить всякую ерунду. Кто-нибудь может помочь?

Вот как это работает сейчас с выпадающим списком, есть ли способ изменить это (категория1) на поле автозаполнения? Я посмотрел на django autocomplete_light, но ни к чему не пришел.

Models.py:

class Category(models.Model):
    details = models.CharField(max_length=250, blank=True, null=True)

    def __str__(self):
        return self.details

class Search(models.Model):
    name = models.CharField(max_length=200)
    email = models.CharField(max_length=200)
    category1 = models.ForeignKey('Category', blank=True, null=True, on_delete=models.CASCADE, related_name='category')

Forms.py:

class NewSearch(forms.ModelForm):
    class Meta:
        model = Search
        fields = ['name', 'email', 'category1']

    def __init__(self, *args, **kwargs):
        super(NewSearch, self).__init__(*args, **kwargs)
        self.fields['category1'] = forms.ModelChoiceField(queryset=Category.objects.all().order_by('details'))
        self.helper = FormHelper()
        self.helper.form_show_labels = False

Views.py:

@csrf_exempt
def search(request):
    my_form = NewSearch()
    if request.method == 'POST':
        my_form = NewSearch(request.POST)
        if my_form.is_valid():
            my_form.save()
            return redirect('frontpage-results')
    context = {
        'my_form': my_form,
    }
    return render(request, 'frontpage/search.html', context)

Search.html:

<form method="POST" class="page-section" enctype="multipart/form-data">
    <div>
        {% csrf_token %}
        <fieldset class="form-group">
             <div class="form-row">
                <div class="form-group col-md-5 mb=0">
                    Your Full Name:
                    {{ my_form.name|as_crispy_field }}
                </div>
                <div class="form-group col-md-7 mb=0">
                    Your E-mail Address:
                    {{ my_form.email|as_crispy_field }}
                </div>
                <div class="form-group col-md-4 mb=0">
                    Category you are looking for:
                    {{ my_form.category1|as_crispy_field }}
                </div>
             </div>
             {{ my_form.media }}        {# Form required JS and CSS #}
        </fieldset>
        <div class="form-group">
            <button class="btn btn-secondary" type="submit" name="first">SEARCH NOW</button>
        </div>
   </div>
</form>

Urls.py:

urlpatterns = [
    path('', views.home, name='frontpage-home'),
    path('search/', views.search, name='frontpage-search'),
]

Попробуйте изменить ваш импорт:

import autocomplete_light.shortcuts as al

al.register

Это изменилось в версии 2.2:

2.2.0rc1

    PENDING BREAK WARNING, Django >= 1.9.

    The good old ``import autocomplete_light`` API support will be dropped with
    Django 1.9. All imports have moved to ``autocomplete_light.shortcuts`` and
    importing ``autocomplete_light`` will work until the project is used with
    Django 1.9.

Очевидно, документация не была обновлена должным образом.

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