Как использовать select2 в django?
Имеется две модели, а именно модели "Computer" и "ASKstatus". Они объедены отношением "один ко многим", поле "comps_to_work" является ключом модели "ASKstatus". Для пользователя отображается форма заполнения рабочего места (за это отвечает модель и форма "ASKstatus"). При нажатии на поле номер компьютера, должен выпадать список со всеми номерами компьютеров созданными с помощью модели "Computer", а также появится поле поиска для быстрого и удобного нахождения нужного компа. Я узнал о существовании библиотеке select2, но не могу её настроить, чтобы форма корректно отображалась пользователю, пожалуйста, поясните как это сделать, или как вы настраивали её у себя (в документацию библиотеки смотрел, не смог понять в чём у меня ошибка). models.py:
class Computer(models.Model):
CHOICES = [
('Да', 'Да'),
('Нет', 'Нет'),
]
number = models.CharField('Номер компьютера', max_length=6, blank=True)
CPU = models.CharField('Процессор', max_length=50, blank=True)
RAM = models.TextField('Оперативная память', max_length=200, blank=True)
Power_unit = models.CharField('Блок питания', max_length=50, blank=True)
Mother_board = models.CharField('Материнская плата', max_length=100, blank=True)
PCI_slot = models.CharField('PCI слот', max_length=3, blank=True, choices=CHOICES)
PCI_express_slot = models.CharField('PCI express слот', max_length=3, blank=True, choices=CHOICES)
ISA_port = models.CharField('ISA порт', max_length=3, blank=True, choices=CHOICES)
LPT_port = models.CharField('LPT порт/параллельный порт', max_length=3, blank=True, choices=CHOICES)
COM_port = models.CharField('COM порт/последовательный порт', max_length=3, blank=True, choices=CHOICES)
Data_storage_device = models.CharField('Устройство хранения данных', max_length=100, blank=True)
video_card = models.CharField('Видеокарта', max_length=100, blank=True)
object_place = models.CharField('Место положения', max_length=200, blank=True)
object_work = models.CharField('Рабочее место', max_length=200, blank=True, null=True)
def __str__(self):
return f'{self.number}'
class Meta:
verbose_name = 'Компьютер'
verbose_name_plural = 'Компьютеры'
class ASKstatus(models.Model):
number = models.CharField('№ п/п', max_length=10, blank=True)
ASK_number = models.CharField('№ АСК',max_length=10, blank=True)
name = models.CharField('Название', max_length=100, blank=True)
product_name = models.CharField('Изделие', max_length=100, blank=True)
note = models.CharField('Примечание', max_length=100, blank=True)
comps_to_work = models.ForignKey('Computer', on_delete=models.SET_NULL, null=True, blank=True)
class Meta:
verbose_name = 'Статус'
verbose_name_plural = 'Статусы'
forms.py:
from django import forms
from django.forms import ModelForm, TextInput
from django_select2.forms import Select2Widget
from .models import Computer, ASKstatus, POstatus, ListEquipment, AskTypes
class StatusForm(ModelForm):
class Meta:
model = ASKstatus
fields = ["number", "ASK_number", "name", "product_name", "note", "comps_to_work"]
widgets = {
"number": TextInput(attrs={
'class': 'form-control',
'placeholder': '№ п/п'
}),
"ASK_number": TextInput(attrs={
'class': 'form-control',
'placeholder': '№ АСК'
}),
"name": TextInput(attrs={
'class': 'form-control',
'placeholder': 'Название'
}),
"product_name": TextInput(attrs={
'class': 'form-control',
'placeholder': 'Изделие'
}),
"note": TextInput(attrs={
'class': 'form-control',
'placeholder': 'Примечание'
}),
"comps_to_work": forms.Select(attrs={
'class': Select2Widget
})
}
HTML представление:
<!doctype html>
{% extends 'base_comp/base.html'%}
{% block content %}
<html lang="ru">
<p></p>
<form method="post" class="form-group col-md-4" style="margin-top: 20px">
<div class="row">
<div class="col">
{{ form.number }}<br>
{{ form.ASK_number }}<br>
{{ form.name }}<br>
</div>
<div class="col" >
{{ form.product_name }}<br>
{{ form.note }}<br>
{{ form.comps_to_work }}<br>
</div>
{% csrf_token %}
<span>{{error}}</span>
</div>
<button type="submit" class="btn btn-success">Добавить</button>
</form>
</html>
{% endblock %}
views.py:
def add_ASK(request):
error = ''
if request.method == 'POST':
form = StatusForm(request.POST)
if form.is_valid():
form.save()
return redirect('/index_S')
else:
error = 'Неверная форма данных'
form = StatusForm()
context = {
'form': form,
'error': error
}
return render(request, "base_comp/add_ASK.html", context)