Django Значения внешнего ключа автозаполнения светового фильтра - PullRequest
0 голосов
/ 04 марта 2020

Я использую библиотеку 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.

Однако эти два поля используются в другой модели Сотрудник , поскольку я хочу выполнить запрос на основе этой модели. Я использовал Django Smart Selects , чтобы связать модели в модели Employee, которая отлично работает. Тем не менее, я пытаюсь отфильтровать свои подвиги, основываясь на навыках, используя библиотеку автозаполнения, но вместо этого получаю все подвиги. Мой Django вид автозаполнения выглядит следующим образом

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')
    }

Я не могу понять, почему мои подчиненные навыки будут не фильтровать по умению вместо того, чтобы показывать все.

1 Ответ

0 голосов
/ 04 марта 2020

Используйте новейшую версию django-autocomplete-light do c. Чтобы отфильтровать результаты по значению других полей в форме, вы должны использовать 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
...