Django Autocomplete Light覆盖html选项以返回自定义值

时间:2017-07-25 02:43:57

标签: django autocomplete django-autocomplete-light

我开始使用DAL,但是我不能使用将值设置为查询集中对象的PK的默认行为。 所以我重写了'get_result_value'用于将自定义字段设置为我的选项的值。

class CategoryAutocomplete(autocomplete.Select2QuerySetView):
    def get_queryset(self):
        country = Agent.get_user_country(self.request.user)
        if not self.request.user.is_authenticated():
            return Category.objects.none()
        qs = Category.objects.filter(country=country)
        if self.q:
            qs = qs.filter(full_category__icontains=self.q)
        return qs

    def get_result_value(self, result):
        return result.special_key

我的问题是,当我提交时,我得到了这个ModelChoiceField错误:

Select a valid choice. That choice is not one of the available choices.

这是表格:

class OnsiteCategoryForm(forms.Form):
    category = forms.ModelChoiceField(queryset=Category.objects.all(), required=True,
                                      widget=autocomplete.ModelSelect2(url='category_autocomplete'))

您是否知道导致此错误的原因是什么? 感谢

1 个答案:

答案 0 :(得分:3)

嗯,这并不是一个完整的答案,但我正好在你的同一个搜索轨道上,你的Q让我处于“几乎工作的方向”。

我的意思是我按照你的代码实现了get_result_value,我可以在模板中用JS获取新值(在我的例子中是slug) 1}}事件。

select2:select

my views.py:

$('select').on('select2:select', function (event) {
  console.log(event.params.data.id);
}

my forms.py:

class DjProfileAutocomplete(autocomplete.Select2QuerySetView):
    def get_queryset(self):
        qs = DjProfile.objects.all()
        return qs.filter(name__icontains=self.q) if self.q else qs

    def get_result_value(self, result):
        return result.slug

def home(request):
    return render(request, 'home.html', {'form': HomeForm()})

请注意,在上面的jQuery代码段中,我仍然引用class HomeForm(forms.Form): dj_name = forms.ModelChoiceField( queryset=DjProfile.objects.all(), widget=autocomplete.ModelSelect2( url='dj-autocomplete', attrs={ # Set some placeholder 'data-placeholder': 'Trova Dj', # Only trigger autocompletion after 3 characters have been typed 'data-minimum-input-length': 3, }, ) ) ,但现在id属性包含event.params.data.id ...