#django #django-autocomplete-light
#django #django-автозаполнение-подсветка
Вопрос:
Только начал использовать django-autocomplete-light (автозаполнение.ModelSelect2) и хотя мне удалось заставить его работать, я подумал, возможно ли передать отключенные параметры?
У меня есть список клиентов на выбор, но некоторые из них по разным причинам не должны быть выбраны, они не должны иметь возможности их использовать. Я знаю, что мог бы отфильтровать этих невыбираемых клиентов, но это было бы не очень удобно, поскольку пользователь мог бы подумать, что клиента нет в базе данных. Если да, может ли кто-нибудь указать мне правильное направление, поскольку я не уверен, с чего начать.
В документации Select2 говорится, что отключение параметров должно быть возможным. Предположительно, если бы я мог также отправить ‘disabled’: true в возвращаемом ответе json, который мог бы это сделать.
Ответ №1:
Хорошо, итак, вот что я придумал, и это работает.
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'],
)
}
Надеюсь, это может быть кому-то полезно.