Я прочитал почти все темы, связанные с автозаполнением, в Django, и я все еще не могу получить поле ввода автозаполнения в своей форме.
Позвольте мне объяснить, что я пытаюсь сделать: Я создаю страницу шаблона контракта, где пользователь вводит данные о сотрудниках, заполняет данные о партнерской компании и вводит некоторые другие соответствующие данные. Затем они go переходят на страницу создания контракта, где им необходимо заполнить форму: поиск сотрудника и его выбор, поиск компании-партнера (с которой сотрудник подпишет контракт), ввод других соответствующих данных и вставка сведений о контракте в базу .
Я застрял на бите "Поиск сотрудника и выберите", потому что не могу получить поле ввода автозаполнения и могу выбрать только поле с заполненными данными из моей базы.
Вот мой код:
settings.py
INSTALLED_APPS = [
'dal',
'dal_select2',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'cargo_contracts',
'django_filters',
]
models.py
class Contracts(models.Model):
employee = models.ForeignKey(Employee, on_delete=models.CASCADE, null=True)
partner_company = models.ForeignKey(PartnerCompany, on_delete=models.CASCADE, null=True)
contract_type = models.ForeignKey(ContractTypes, on_delete=models.CASCADE, blank=False)
car = models.ForeignKey(Cars, on_delete=models.CASCADE, null=True)
contract_number = models.IntegerField(default=0, null=True)
signing_date = models.DateField(auto_now_add=False, blank=True, null=True)
salary = models.IntegerField(default=0, null=True)
contract_percentage = models.IntegerField(default=0, null=True)
def __str__(self):
return str(self.contract_type)
class Meta:
verbose_name_plural = 'Contracts'
class Employee(models.Model):
name = models.CharField(max_length=128, unique=False)
jmbg_number = models.CharField(max_length=13)
address = models.CharField(max_length=PartnerCompany.ADDRESS_NAME_MAX_LENGTH, unique=False)
id_number = models.CharField(max_length=10)
id_issuer = models.CharField(max_length=128, unique=False)
city = models.CharField(max_length=64, unique=False)
municipality = models.CharField(max_length=64, unique=False)
profession = models.CharField(max_length=64, unique=False)
profession_lvl = models.IntegerField(default=0, unique=False)
def __str__(self):
return self.name
views.py
class EmployeeAutocomplete(autocomplete.Select2QuerySetView):
def get_queryset(self):
# Don't forget to filter out results depending on the visitor !
#if not self.request.user.is_authenticated():
#return Employee.objects.none()
qs = Employee.objects.all()
print(qs)
if self.q:
qs = qs.filter(name__icontains=self.q)
print(qs)
return qs
forms.py
class ContractForm(forms.ModelForm):
employee = forms.ModelChoiceField(queryset=Employee.objects.all())
partner_company = forms.ModelChoiceField(queryset=PartnerCompany.objects.all(), initial=3)
contract_type = forms.ModelChoiceField(queryset=ContractTypes.objects.all(), initial=2)
car = forms.ModelChoiceField(queryset=Cars.objects.all(), initial=3)
contract_number = forms.IntegerField(label="Broj ugovora")
signing_date = forms.DateField(label="Datum potpisivanja")
salary = forms.IntegerField(label="Bruto zarada")
contract_percentage = forms.IntegerField(label="Procenat iz ugovora")
class Meta:
model = Contracts
fields = ('employee', 'partner_company', 'contract_type', 'car', 'contract_number', 'signing_date',
'salary', 'contract_percentage',)
widgets = {'employee': autocomplete.ModelSelect2(url='employee_autocomplete',
attrs={
'data-placeholder': 'Ime i prezime',
'data-minimum-input-length': 3,
},
)
}
urls.py
urlpatterns = [
url(r'^employee_autocomplete/$', views.EmployeeAutocomplete.as_view(), name='employee_autocomplete'),
]
контракт. html
<div class="col-md-6">
<div class="card card-body">
<form method="POST" action="">
{% csrf_token %}
{% for field in contract_form %}
{{ field }}
{{ contract_form.media }}
{% endfor %}
<input class="btn btn-primary btn-block" type="submit" name="submit" value="Add">
</form>
</div>
</div>
база. html
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T"
crossorigin="anonymous">
<link href="{% static 'autocomplete-light/autocomplete_light/select2.css' %}"
type="text/css" media="all" rel="stylesheet">
<link href="{% static 'autocomplete-light/admin/css/vendor/select2/select2.css' %}"
type="text/css" media="all" rel="stylesheet">
<script type="text/javascript" src="{% static 'autocomplete-light/autocomplete_light/autocomplete.init.js' %}"></script>
<script type="text/javascript" src="{% static 'autocomplete-light/autocomplete_light/select2.js' %}"></script>
<script type="text/javascript" src="{% static 'autocomplete-light/admin/js/vendor/jquery/jquery.js' %}"></script>
<script type="text/javascript" src="{% static 'autocomplete-light/admin/js/autocomplete.js' %}"></script>
<script type="text/javascript" src="{% static 'autocomplete-light/admin/js/vendor/select2/select2.full.js' %}"></script>
<script src="{% static 'js/jquery.min.js' %}"></script>
<script src="http://code.jquery.com/ui/1.9.2/jquery-ui.js"></script>
Вот что я получаю: снимок экрана
Я прочитал документацию django при автозаполнении несколько раз, но я все еще застрял на ней. Я не могу получить поле ввода с автозаполнением. Я не вижу, где я что-то упускаю, поэтому, пожалуйста, помогите мне. :) Если вам понадобится что-нибудь еще из моего кода, просто дайте мне сейчас, я прикреплю его.