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)

Reply via email to