Отключение опций в django-autocomplete-light - PullRequest
0 голосов
/ 26 марта 2019

Только что начал использовать django-autocomplete-light (autocomplete.ModelSelect2), и, хотя мне удалось заставить его работать, я подумал, можно ли пропустить отключенные опции?

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

В документации Select2 говорится, что отключение опций должно быть возможным. Предположительно, если бы я мог также отправить 'disabled': true в ответе json, который мог бы это сделать.

1 Ответ

0 голосов
/ 26 марта 2019

ОК, вот что я придумал, и это работает.

view.py

Select2ViewMixin разделяется на подклассы, а затем к данным клиента добавляется атрибут «disabled».Это значение предоставляется представлением ParentAutocomplete.

from dal import autocomplete
from dal_select2.views import Select2ViewMixin
from dal.views import BaseQuerySetView

class CustomSelect2ViewMixin(Select2ViewMixin):
    def get_results(self, context):
        return [
            {
                'id': self.get_result_value(result),
                'text': self.get_result_label(result),
                'selected_text': self.get_selected_result_label(result),
                'disabled': self.is_disabled_choice(result), # <-- this gets added
            } for result in context['object_list']
        ]

class CustomSelect2QuerySetView(CustomSelect2ViewMixin, BaseQuerySetView):
    """Adds ability to pass a disabled property to a choice."""

class ParentAutocomplete(CustomSelect2QuerySetView):

    def get_queryset(self):
        qs = Customer.objects.all()

        if self.q:
            qs = qs.filter(org_name__icontains=self.q)

        return qs.order_by('org_name', 'org_city')

    def get_result_label(self, item):
        return item.selector_name

    def get_selected_result_label(self, item):
        return item.selector_name

    def is_disabled_choice(self, item): # <-- this is where we determine if the record is selectable or not.
        customer_id = self.forwarded.get('customer_id', None)
        return not (item.can_have_children and not str(item.pk) == customer_id)

form.py Затем форма используется как обычно.

from dal import autocomplete

class CustomerBaseForm(forms.ModelForm):
    customer_id= forms.IntegerField(required=False, widget=forms.HiddenInput)

    class Meta:
        model = Customer
        widgets = {
            'parent':autocomplete.ModelSelect2(
                url='customer:parent-autocomplete',
                forward=['customer_id'],
            )
        }

Надеемся, что это может быть кому-то полезно.

...