在我的选择字段 Django 中包含 search/filtering

Include search/filtering in my choicefield django

我有一个 CrispyForm,其中有一个名为“act_cuenta”的 ChoiceField,其中包含我从查询中加载的选项。 我希望在此字段中,用户可以选择键入和搜索列表中的选项之一。

form.py

class MayoresForm(Form):
    act_cuenta = ()

    act_fechaini = DateField(
        widget=DatePickerInput(
            format=Form_CSS.fields_date_format,
            options=Form_CSS.fields_date_opts,
            attrs={'value': Form_CSS.fields_current_date}
        ),
        label="Fecha desde: ",
        required=True,
    )
    act_fechafin = DateField(
        widget=DatePickerInput(
            format=Form_CSS.fields_date_format,
            options=Form_CSS.fields_date_opts,
            attrs={'value': Form_CSS.fields_current_date}
        ),
        label="Fecha hasta: ",
        required=True,
    )

    def __init__(self, *args, **kwargs):
        self.AIGN_OPCIONES = kwargs.pop("AIGN_OPCIONES")
        self.PERMISOS = []  # para recuperar los permisos de la tabla
        __json_values = json.loads(json.dumps(self.AIGN_OPCIONES))
        self.PERMISOS = recuperarPermisos(__json_values, 'con.transaccioncab')
        self.AIGN_PER_ID = kwargs.pop("AIGN_PER_ID")

        super(MayoresForm, self).__init__(*args, **kwargs)

        self.fields['act_cuenta'] = ChoiceField(label='Cuenta: ', choices=self.get_choices(), required=True)

        for form in self.visible_fields():
            form.field.widget.attrs['autocomplete'] = Form_CSS.fields_autocomplete
            form.field.widget.attrs['class'] = Form_CSS.fields_attr_class
        self.helper = FormHelper(self)
        self.helper.form_method = 'post'
        self.helper.form_id = Form_CSS.getFormID(self)
        self.helper.attrs = Form_CSS.form_attrs
        self.helper.form_tag = True
        self.helper.label_class = 'col-sm-3 text-right form-control-sm'
        self.helper.field_class = 'col-sm-6'
        self.helper.layout = Layout(
            Div(
                DivHeaderWithButtons(instance_pk=None, remove_create=False, remove_delete=True, remove_print=True,
                                     remove_cancel=False,
                                     permisos=self.PERMISOS,
                                     save_name=' Consultar'),
                Div(
                    Div(
                        Div(
                            Div(
                                Div(
                                    HTML("<h3 class='card-title'>Buscar por:</h3>"),
                                    css_class='card-header'
                                ),
                                Div(
                                    Div(
                                        'act_cuenta',
                                        css_class='card-body'
                                    ),
                                    Div(
                                        'act_fechaini',
                                        'act_fechafin',
                                        css_class='card-body'
                                    ),
                                    css_class="row"
                                ),
                                css_class='card card-secondary'
                            ),
                            css_class='col-sm',
                        ),
                        css_class='row',
                    ),
                    css_class='card-body'
                ),
                css_class='card'
            ),
        )

    def get_choices(self):
        all_tipoaux = Con_Cuenta.objects.filter(cue_grupo='M', cue_estado=1, per_id=self.AIGN_PER_ID).order_by(
            'cue_codigov').values()
        DOC = [(d['cue_codigov'], d['cue_codigov'] + ' - ' + d['cue_nombre']) for d in all_tipoaux]
        return DOC

我该怎么做? 我看到有django-filter存在,但是不知道怎么和crispy-forms一起实现。

解决方案:

我能够使用 Select2 库解决问题。

self.fields['act_cuenta'] = ModelChoiceField(label=u'Cuenta: ', queryset=self.get_choices(),
                                                     widget=ModelSelect2Widget(
                                                         search_fields=['cue_nombre__icontains',
                                                                        'cue_codigov__icontains'],
                                                         dependent_fields={'cue_codigov': 'cue_codigov'},
                                                         attrs={"data-placeholder": '-- Cuenta --',
                                                                'data-minimum-input-length': 0,
                                                                'style': 'width: 120%;'},
                                                         # to_field_name="cue_codigov"
                                                     ), required=True)