【问题标题】:Django AutoComplete Light Filter Foreign Key ValuesDjango AutoComplete Light Filter 外键值
【发布时间】:2020-03-04 13:29:14
【问题描述】:

我正在使用Django AutoComplete Light 库根据主键过滤表单值。我有两个模型如下:

class Skill(models.Model):
    name = models.CharField(max_length=50)

    def __str__(self):
    return self.name



  class SubSkill(models.Model):
        name = models.CharField(max_length=50)
        skill = models.ForeignKey(Skill, on_delete=models.CASCADE, null=True)
        def __str__(self):
        return self.name.

但是,这两个字段在另一个 Employee 模型中使用,因为我想根据这个模型进行查询。我曾使用Django Smart Selects 将模型链接到 Employee 模型中,效果很好。但是,我正在尝试使用自动完成库根据技能过滤我的子技能,而是获取所有子技能。我的 Django Autocomplete light 视图如下所示

class SubskillsAutocomplete(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 Country.objects.none()

    qs = SubSkill.objects.all()

    if self.q:
        qs = qs.filter(name__istartswith=self.q)

    return qs

我的模型表格如下所示:

class EmployeeSkillForm(forms.ModelForm):

class Meta:
    model = Employee
    fields = ('skills','sub_skills', 'experience','resume','certificates')
    widgets = {
        'sub_skills': autocomplete.ModelSelect2Multiple(url='skills-autocomplete')
    }

我不明白为什么我的子技能不会根据技能过滤而不是显示所有内容。

【问题讨论】:

    标签: django django-autocomplete-light django-smart-selects


    【解决方案1】:

    使用最新版本的django-autocomplete-light doc。 要根据表单中其他字段的值过滤结果,您必须使用 forward 参数。

    形式:

    class EmployeeSkillForm(forms.ModelForm):
    
        class Meta:
            model = Employee
            fields = ('skills','sub_skills', 'experience','resume','certificates')
            widgets = {
               'sub_skills': autocomplete.ModelSelect2Multiple(url='skills-autocomplete', 
                                                                forward=['skills'])
                      }
    

    Django 自动完成轻视图:

    class SubskillsAutocomplete(autocomplete.Select2QuerySetView):
    
        def get_queryset(self):
    
            qs = SubSkill.objects.all()
            skills = self.forwarded.get('skills', None)
    
            if skills:
                qs = qs.filter(skill__in=skills)
    
            if self.q:
                qs = qs.filter(name__istartswith=self.q)
    
    
            return qs
    

    【讨论】:

    • 这行得通!非常有帮助。我的主要挑战是使用转发值和基于技能过滤子技能。再次感谢
    • 有一个挑战,当我尝试选择我得到的技能时 选择一个有效的选择。该选项不是可用选项之一。
    猜你喜欢
    • 2016-10-12
    • 1970-01-01
    • 2018-02-17
    • 2021-10-14
    • 2018-09-20
    • 1970-01-01
    • 2017-03-26
    • 2016-01-17
    • 2016-09-10
    相关资源
    最近更新 更多