HTML input textbox in Django admin.py filter -
i filter data in django (admin.py) text writen in html input textbox. need filter companies city in , list of cities long. replace list of cities in filter 1 text input. found similar here http://djangosnippets.org/snippets/2429/ there 2 problems:
- author did not posted models.py, difficuilt change code needs (+ no comments)
- there used class userfieldfilterspec(relatedfilterspec): need use allvaluesfilterspec instead of relatedfilterspec (more in file django/contrib/admin/filterspecs.py), because list of towns in same class comapny (there shoud class of towns , should referencing company foreign key (manytomany relationship), reasons have done way)
important part of models.py looks this
class company(models.model): title = models.charfield(max_length=150,blank=false) city = models.charfield(max_length=50,blank=true)
and admin.py
class catalogadmin(admin.modeladmin): form = catalogform list_display = ('title','city') list_filter = ['city',]
so again, need to: 1. instead of list od cities display 1 text input in django filter 2. after inputing city neme in text input, filter data city (request filtering can sent submit button or through javascript)
thank yoy posts.
in case still need this. little hackish in template, implemented without piece of js.
filters.py
from django.contrib.admin import listfilter class singletextinputfilter(listfilter): """ renders filter form text input , submit button """ parameter_name = none template = "admin/textinput_filter.html" def __init__(self, request, params, model, model_admin): super(singletextinputfilter, self).__init__( request, params, model, model_admin) if self.parameter_name none: raise improperlyconfigured( "the list filter '%s' not specify " "a 'parameter_name'." % self.__class__.__name__) if self.parameter_name in params: value = params.pop(self.parameter_name) self.used_parameters[self.parameter_name] = value def value(self): """ returns value (in string format) provided in request's query string filter, if any. if value wasn't provided returns none. """ return self.used_parameters.get(self.parameter_name, none) def has_output(self): return true def expected_parameters(self): """ returns list of parameter names expected request's query string , used filter. """ return [self.parameter_name] def choices(self, cl): all_choice = { 'selected': self.value() none, 'query_string': cl.get_query_string({}, [self.parameter_name]), 'display': _('all'), } return ({ 'get_query': cl.params, 'current_value': self.value(), 'all_choice': all_choice, 'parameter_name': self.parameter_name }, )
textinput_filter.html
{% load i18n %} <h3>{% blocktrans filter_title=title %} {{ filter_title }} {% endblocktrans %}</h3> {#i item, short in names#} {% choices.0 %} <ul> <li> <form method="get"> <input type="search" name="{{ i.parameter_name }}" value="{{ i.current_value|default_if_none:"" }}"/> {#create hidden inputs preserve values other filters , search field#} {% k, v in i.get_query.items %} {% if not k == i.parameter_name %} <input type="hidden" name="{{ k }}" value="{{ v }}"> {% endif %} {% endfor %} <input type="submit" value="{% trans 'apply' %}"> </form> </li> {#show "all" link reset current filter#} <li{% if i.all_choice.selected %} class="selected"{% endif %}> <a href="{{ i.all_choice.query_string|iriencode }}"> {{ i.all_choice.display }} </a> </li> </ul> {% endwith %}
then according models
class catalogcityfilter(singletextinputfilter): title = 'city' parameter_name = 'city' def queryset(self, request, queryset): if self.value(): return queryset.filter(city__iexact=self.value()) class catalogadmin(admin.modeladmin): form = catalogform list_display = ('title','city') list_filter = [catalogcityfilter,]
ready use filter this.
Comments
Post a Comment