首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新Django-Select2 2 AutoModelSelect2Field的查询集

更新Django-Select2 2 AutoModelSelect2Field的查询集
EN

Stack Overflow用户
提问于 2013-12-14 18:22:18
回答 1查看 3.7K关注 0票数 2

我不知道如何动态更新AutoModelSelect2Field的查询集。我得到的结果很奇怪。例如,有时select2框将返回正确的过滤结果,有时当我输入相同的字符时它将不返回任何结果。

我的代码:

代码语言:javascript
复制
#views.py
form = MyForm()


#forms.py
class MyField(AutoModelSelect2Field):
    search_fields = ['name__icontains']
    max_results = 10


class MyForm(forms.Form):
    my_field = MyField(
        queryset=project.objects.none(),
        required=True,
        widget=AutoHeavySelect2Widget(
            select2_options={
                'width': '100%',
            }
        )
    )

    def __init__(self, *args, **kwargs):
        qs = kwargs.pop('queryset')
        self.base_fields['my_field'].queryset = qs
        super(MyForm, self).__init__(*args, **kwargs)
        #self.fields['my_field'].queryset = qs
        #self.base_fields['my_field'].queryset = qs

我试过的几件事-

意见中的最新情况:

代码语言:javascript
复制
#views.py
form = MyForm()
form.base_fields['my_field'].queryset = new_qs

以及:

代码语言:javascript
复制
form = MyForm()
form.fields['my_field'].queryset = new_qs

将qs传递给表单:

代码语言:javascript
复制
#views.py
form = MyForm(queryset=Project.objects.filter(project_type=pt))

# see above code for forms.py

我还尝试将初始qs设置为所有对象:

代码语言:javascript
复制
class MyForm(forms.Form):
    my_field = MyField(
        queryset=project.objects,
        ...

但我也遇到了同样的问题,90%的时间我得到了初始查询集的结果,而不是基于新qs的过滤对象。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-23 14:47:51

我们找到了一种非常简单的方法,可以通过额外的字段来筛选下拉选项(即。首先选择国家,然后使州下拉菜单仅显示来自选定国家的州)

它受到了来自这里的一个建议的启发(我们也在这里发布了这个解决方案):https://github.com/applegrew/django-select2/issues/22

在forms.py中:

代码语言:javascript
复制
class StateChoices(AutoModelSelect2Field):
    queryset = State.objects
    def get_results(self, request, term, page, context):
        country =  request.GET.get('country', '')

        states = State.objects.filter(country=country, name__istartswith=term)
        s2_results = [(s.id, s.name, {}) for s in states]

        return ('nil', False, s2_results)

表单字段:

代码语言:javascript
复制
# only include this when you would have a screen where the country 
# is preset and would not change, but you want to use it as a search context
country = forms.ModelChoiceField(queryset=Country.objects.all(),
                                 widget=forms.HiddenInput())
state = StateChoices(widget = AutoHeavySelect2Widget(
    select2_options = {
        'minimumInputLength': 1,
        'ajax': {
            'dataType': 'json',
            'quietMillis': 100,
            'data': JSFunctionInContext('s2_state_param_gen'),
            'results': JSFunctionInContext('django_select2.process_results'),
        }
    }))

在我们的javascript中:

代码语言:javascript
复制
function s2_state_param_gen(term, page) {
    var proxFunc = $.proxy(django_select2.get_url_params, this);
    results = proxFunc(term, page, 's2_condition_param_gen');
    results.country = $('#id_country').val();
    return results;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20586690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档