Django Autocomplete-Light застрял в поле ввода автозаполнения - PullRequest
0 голосов
/ 16 апреля 2020

Я прочитал почти все темы, связанные с автозаполнением, в 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 при автозаполнении несколько раз, но я все еще застрял на ней. Я не могу получить поле ввода с автозаполнением. Я не вижу, где я что-то упускаю, поэтому, пожалуйста, помогите мне. :) Если вам понадобится что-нибудь еще из моего кода, просто дайте мне сейчас, я прикреплю его.

...