1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Merge branch 'develop' into develop-2.9

This commit is contained in:
Jeremy Stretch
2020-07-08 13:04:57 -04:00
7 changed files with 73 additions and 23 deletions

View File

@ -611,21 +611,24 @@ class DynamicModelChoiceMixin:
filter = django_filters.ModelChoiceFilter
widget = APISelect
def _get_initial_value(self, initial_data, field_name):
return initial_data.get(field_name)
def filter_queryset(self, data):
field_name = getattr(self, 'to_field_name') or 'pk'
# If multiple values have been provided, use only the last.
if type(data) in (list, tuple):
data = data[-1]
filter = self.filter(
field_name=field_name
)
return filter.filter(self.queryset, data)
def get_bound_field(self, form, field_name):
bound_field = BoundField(form, self, field_name)
# Override initial() to allow passing multiple values
bound_field.initial = self._get_initial_value(form.initial, field_name)
# Modify the QuerySet of the field before we return it. Limit choices to any data already bound: Options
# will be populated on-demand via the APISelect widget.
data = bound_field.value()
if data:
filter = self.filter(field_name=self.to_field_name or 'pk', queryset=self.queryset)
self.queryset = filter.filter(self.queryset, data)
self.queryset = self.filter_queryset(data)
else:
self.queryset = self.queryset.none()
@ -655,11 +658,16 @@ class DynamicModelMultipleChoiceField(DynamicModelChoiceMixin, forms.ModelMultip
filter = django_filters.ModelMultipleChoiceFilter
widget = APISelectMultiple
def _get_initial_value(self, initial_data, field_name):
# If a QueryDict has been passed as initial form data, get *all* listed values
if hasattr(initial_data, 'getlist'):
return initial_data.getlist(field_name)
return initial_data.get(field_name)
def filter_queryset(self, data):
field_name = getattr(self, 'to_field_name') or 'pk'
# Normalize data to a list
if type(data) not in (list, tuple):
data = [data]
filter = self.filter(
field_name=field_name,
lookup_expr='in'
)
return filter.filter(self.queryset, data)
class LaxURLField(forms.URLField):