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.
Очевидно, документация не была обновлена должным образом.