Django Autocomplete Light 将 html 选项覆盖为 return 自定义值

Django Autocomplete Light override html options to return custom value

我开始使用 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'))

您是否知道可能导致此错误的原因? 谢谢

好吧,这并不是一个完整的答案,但我正好在你的同一个搜索轨道上,你的 Q 把我放在 "almost-working-direction"。

我的意思是我根据您的代码实现了 get_result_value 并且我可以通过模板中的 JS 获取新值(在我的例子中是 slugselect2:select 事件。

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

我的views.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()})

我的forms.py:

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

请注意,在上面的 jQuery 片段中我仍然引用 id,但现在 event.params.data.id 属性包含 slug ...