刚刚开始使用django-autocomplete-light (autocomplete.ModelSelect2),虽然我已经设法让它工作了,但我想知道是否有可能传递禁用的选项?
我有一个客户列表可供选择,但由于各种原因,有些客户不应该被选中,他们不应该使用它们。我知道我可以过滤掉这些不可选的客户,但这不是很有用,因为用户可能认为客户不在数据库中。如果是这样的话,有人能给我指个方向吗?因为我不知道从哪里开始。
它在Select2文档中说,禁用选项应该是可能的。假设我还可以在返回的json响应中发送一个'disabled':true,就可以做到这一点。
发布于 2019-03-27 04:06:38
好了,这就是我想出的方法,它起作用了。
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'],
)
}
希望这能对某些人有用。
https://stackoverflow.com/questions/55354559
复制相似问题