Django_filters с django-autocomplete-light

Я использую django-autocomplete-light с django_filters. Я просмотрел django-filter с django autocomplete-light, но мое автозаполнение не т работать.

Models.py:

class ProfessionalDevelopment(models.Model):
   Name = models.CharField("Professional Development", max_length=20,default = "None")
   ProfessionalExperience = models.ManyToManyField(Person, through='PersonToProfessionalDevelopment')

class PersonToProfessionalDevelopment(models.Model):
   PersonID = models.ForeignKey(Person,  on_delete=models.CASCADE)
   ProfID = models.ForeignKey(ProfessionalDevelopment,  on_delete=models.CASCADE)
   Desc = models.CharField("Professional Development Description", max_length=30, default="None")

Views.py:

class ProfessionalDevelopmentAutocomplete(autocomplete.Select2QuerySetView):
 def get_queryset(self):
    qs = ProfessionalDevelopment.objects.all()
    if self.q:
        qs = qs.filter(name__istartswith=self.q)
    return qs

urls.py

urlpatterns = [url(r'^search/ProfessionalDevelopment-autocomplete/$', ProfessionalDevelopmentAutocomplete.as_view(),
    name='ProfessionalDevelopment-autocomplete']

Filters.py:

ProfessionalDevelopment = django_filters.CharFilter(name='professionaldevelopment__Name', lookup_expr='icontains',
                                                    widget=autocomplete.ModelSelect2(url='RSR:ProfessionalDevelopment-autocomplete'))

Я получил сообщение об ошибке: объект «список» не имеет атрибута «запрос». Затем я изменил код на autocomplete.Select2 вместо autocomplete.ModelSelect2 (согласно https://github.com/yourlabs/django-autocomplete-light/issues/763). Хотя ошибки нет, но я не могу ввести текст в поле ввода. Может ли кто-нибудь помочь мне? Спасибо


person Doris    schedule 21.07.2017    source источник


Ответы (1)


Вы хотите отфильтровать модель ProfessionalDevelopment по ее имени. Вам необходимо изменить следующие шаги: 1, заполните строку str или unicode для модели ProfessionalDevelopment, иначе опция, отображаемая в фильтре, будет иметь идентификатор.

class ProfessionalDevelopment(models.Model):
   Name = models.CharField("Professional Development", 
   max_length=20,default = "None")
   ProfessionalExperience = models.ManyToManyField(Person, 
   through='PersonToProfessionalDevelopment')

   def __unicode__(self):
       return self.name

2, изменить поле фильтра ProfessionalDevelopment:

ProfessionalDevelopment = django_filters.ModelChoiceField(
    queryset=ProfessionalDevelopment.objects.all(), 
    widget=autocomplete.ModelSelect2(url="yourcompleteurl")
)

эти шаги должны решить вашу проблему.

и не забудьте добавить {{ form.media }} в свой шаблон

person wllbll    schedule 21.07.2017
comment
Привет, я следовал твоему коду. Но это все еще не работает. Фильтр становится выпадающим списком без каких-либо значений. - person Doris; 22.07.2017
comment
@Doris, вы добавили {{ form.media }} в шаблон? - person wllbll; 22.07.2017
comment
Нет, я не. Для чего это? Где я должен добавить в шаблон? Спасибо - person Doris; 22.07.2017
comment
@Doris {{ form.media }} сообщит шаблону о необходимости добавления тегов js и css, это упоминается в документе dal. - person wllbll; 23.07.2017
comment
После того, как я добавил {{form.media}} в шаблон, все равно не работает. Фильтр в передней части по-прежнему представляет собой коробку, которая не позволяет мне печатать. У Вас есть какие-то предложения? Благодарность - person Doris; 25.07.2017
comment
Привет, я выполнил код, и он работает, но у вас есть небольшая опечатка в django_filters.ModelChoiceField -> django_filters.ModelChoiceFilter. Я пытался исправить это, но мое изменение было меньше 6 символов. Спасибо - person mr antoni; 18.07.2018