I need something like this, of course magic is in FormFilter :), so I am lookig for something in admin app with this behaivor
class MatriculaForm(forms.Form): # I am using django-ajax-selects, lookups are out of scope disciplina = AutoCompleteSelectMultipleField('disciplinas', required=False, help_text=None) ciclo = forms.ModelMultipleChoiceField(queryset=Ciclo.objects.all(), required=False) proyecto = AutoCompleteSelectMultipleField('proyectos', required=False, help_text=None) class MatriculaFilter(FormFilter): template = "matriculafilter/filter_template.html" form = MatriculaForm title = "Matricula Filter" # Needs for autocomplete fields that insert other input remove_params = ['filtro', 'disciplina_text', 'proyecto_text'] #Map form fields with model fields for example FK relations map_parameters = {'ciclo': 'proyeccion__ciclo'} class MatriculaAdmin(admin.ModelAdmin) list_filter = ( MatriculaFilter, ) 2016-02-20 9:56 GMT-06:00 Luis Zárate <luisz...@gmail.com>: > I am trying to insert a filter in the admin site that have 2 autocomplete > inputs so I was thinking to do passed a form with a custom filter, but I > only find a list filter documentation. > > I solved the problem writing a custom filter, with a little problem with > css, because change list view has few width space for filter so input > looks terrible. > > i needed to search in the django code because i didn't find in > documentation. > > I think my solution is generic so I am asking me if django has this > functionally implemented, I didn't find but maybe you know something about. > > -- > "La utopía sirve para caminar" Fernando Birri > > > > -- "La utopía sirve para caminar" Fernando Birri -- You received this message because you are subscribed to the Google Groups "Django users" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscr...@googlegroups.com. To post to this group, send email to django-users@googlegroups.com. Visit this group at https://groups.google.com/group/django-users. To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CAG%2B5VyN-aRsTn06BmFaJjG0JP_-f5X7J4eH0%3DyB5ziAEFRmd5A%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
from django.contrib import admin class FormFilter(admin.ListFilter): template = "formfilter/filter_template.html" form = None form_instance = None remove_params = [] map_parameters = None # {} delimeter = "|" def _get_map_filter(self): if self.map_parameters is None: self.map_parameters = {} for param in self._get_parameter_name(): if param not in self.map_parameters: self.map_parameters[param] = param return self.map_parameters def get_map_filter(self): """ Overwrite this function to provide new map params def get_map_filter(self): dev = super(MyClass, self).get_map_filter dev['myparam'] = 'query_set_param' return dev """ return self._get_map_filter() def _get_parameter_name(self, request=None): if self.form_instance is None: if request is not None: self.form_instance = self.form(request.GET) else: self.form_instance = self.form() return self.form_instance.fields.keys() def __init__(self, request, params, model, model_admin): self.used_parameters = {} # intentional comment this line # super(FormFilter, self).__init__( # request, params, model, model_admin) if self.form is None: raise ImproperlyConfigured( "The form filter '%s' does not specify " "a 'form'." % self.__class__.__name__) for parameter_name in self._get_parameter_name(request): if parameter_name in params: value = params.pop(parameter_name) self.used_parameters[parameter_name] = value for param in self.remove_params: if param in params: params.pop(param) def has_output(self): return True def value(self): """ Returns the value (in string format) provided in the request's query string for this filter, if any. If the value wasn't provided then returns None. """ return None # I not sure what is doing here. def expected_parameters(self): return self._get_parameter_name() def choices(self, cl): yield {'title': self.title, 'form': self.form_instance } def get_real_value(self, value): if not value: return None if self.delimeter in value: values = [x for x in value.split(self.delimeter) if x != self.delimeter and x != ''] if len(values): return values else: return None return value def get_filters(self): query_filter = {} map_parameters = self.get_map_filter() for used_param in self.used_parameters: value = self.get_real_value(self.used_parameters[used_param]) filter_name = map_parameters[used_param] if value is None: continue if isinstance(value, list): filter_name += '__in' query_filter[filter_name] = value return query_filter def queryset(self, request, queryset): query_filters = self.get_filters() return queryset.filter(**query_filters)