Skip to content
This repository has been archived by the owner on Jun 29, 2020. It is now read-only.

Commit

Permalink
GroupListLinkWidget実装した
Browse files Browse the repository at this point in the history
  • Loading branch information
giginet committed Aug 9, 2014
1 parent f83f951 commit 9062601
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 3 deletions.
6 changes: 3 additions & 3 deletions src/kawaz/apps/products/filters.py
@@ -1,21 +1,21 @@
from django.utils.translation import ugettext as _
import django_filters
from django_filters import filters
from django_filters import widgets
from .models import Product
from .models import Category, Platform
from kawaz.core.filters.widgets import ListGroupLinkWidget


class ProductFilter(django_filters.FilterSet):
platforms = filters.ModelChoiceFilter(
label=_('Platforms'),
queryset=Platform.objects.all(),
widget=widgets.LinkWidget(choices=[('', _('All'))]))
widget=ListGroupLinkWidget(choices=[('', _('All'))]))

categories = filters.ModelChoiceFilter(
label=_('Categories'),
queryset=Category.objects.all(),
widget=widgets.LinkWidget(choices=[('', _('All'))]))
widget=ListGroupLinkWidget(choices=[('', _('All'))]))

class Meta:
model = Product
Expand Down
1 change: 1 addition & 0 deletions src/kawaz/core/filters/__init__.py
@@ -0,0 +1 @@
__author__ = 'giginet'
55 changes: 55 additions & 0 deletions src/kawaz/core/filters/widgets.py
@@ -0,0 +1,55 @@
from urllib.parse import urlencode
from django_filters.widgets import LinkWidget
from django.forms.widgets import flatatt
from django.db.models.fields import BLANK_CHOICE_DASH
from django.utils.safestring import mark_safe
from django.utils.encoding import force_text
from django.utils.translation import ugettext as _

__author__ = 'giginet'


class ListGroupLinkWidget(LinkWidget):
"""
Django FilterのfieldsをBootstrapのList Groupを使って出力するWidget
<div class="list-group">
<a href="list-group-item" class="">All</a>
<a href="list-group-item active" class="">Item1</a>
<a href="list-group-item" class="">Item2</a>
</div>
"""

def render(self, name, value, attrs=None, choices=()):
if not hasattr(self, 'data'):
self.data = {}
if value is None:
value = ''
final_attrs = self.build_attrs(attrs)
output = ['<div class="list-group"%s>' % flatatt(final_attrs)]
options = self.render_options(choices, [value], name)
if options:
output.append(options)
output.append('</div>')
return mark_safe('\n'.join(output))

def render_option(self, name, selected_choices,
option_value, option_label):
option_value = force_text(option_value)
if option_label == BLANK_CHOICE_DASH[0][1]:
option_label = _("All")
data = self.data.copy()
data[name] = option_value
selected = data == self.data or option_value in selected_choices
try:
url = data.urlencode()
except AttributeError:
url = urlencode(data)
return self.option_string() % {
'attrs': selected and ' class="list-group-item active"' or '',
'query_string': url,
'label': force_text(option_label)
}

def option_string(self):
return '<a%(attrs)s href="?%(query_string)s" class="list-group-item">%(label)s</a>'

0 comments on commit 9062601

Please sign in to comment.