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 <[email protected]>:

> 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 [email protected].
To post to this group, send email to [email protected].
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