【问题标题】:Django_filters with django-autocomplete-light带有 django-autocomplete-light 的 Django_filters
【发布时间】:2022-01-29 18:11:03
【问题描述】:

我正在使用 django-autocomplete-light 和 django_filters。我看了django-filter with 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)。虽然没有报错,但我无法在文本输入框中输入。有人可以帮助我吗?谢谢

【问题讨论】:

    标签: python django django-autocomplete-light django-filters


    【解决方案1】:

    您想根据模型名称过滤模型ProfessionalDevelopment。 您需要按以下步骤进行修改:

    1. 在型号ProfessionalDevelopment 上填写str 或Unicode,否则过滤器上显示的选项将为id

      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.ModelChoiceFilter(
          queryset=ProfessionalDevelopment.objects.all(), 
          widget=autocomplete.ModelSelect2(url="yourcompleteurl")
      )
      

    这些步骤应该可以解决您的问题。不要忘记在您的模板中添加{{ form.media }}

    【讨论】:

    • 嗨,我遵循了你的代码。但它仍然不起作用。过滤器变成一个下拉列表,其中没有任何值。
    • @Doris 你在模板中添加了 {{ form.media }} 吗?
    • 不,我没有。这个是来做什么的?我应该在哪里添加模板?谢谢
    • @Doris {{ form.media }} 会告诉模板添加必要的 js 和 css 标签,这在 dal 文档中有所提及。
    • 在模板中添加 {{form.media}} 后,仍然无法正常工作。前端的过滤器仍然是一个不允许我输入的框。你有什么建议吗?谢谢
    猜你喜欢
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 2017-03-26
    • 2016-03-17
    • 2015-10-15
    • 2013-01-06
    相关资源
    最近更新 更多