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

Commit

Permalink
django-filters の使い方が間違っていたので修正した
Browse files Browse the repository at this point in the history
django-filtersで追加要素を指定したい場合はWidgetレベルでの追加が適しているが
既存コードは不要なHackを行なっていたために問題が発生していた。
その部分を本来あるべき姿に直した。

ついでに例としてProductページの絞り込み機能もdjango-filtersを使うように修正を
行った。

まぁ今回の修正はドキュメントにしっかりと書いてないレベルだから仕方ない。
django-filtersのソースコードはある程度読み込むことをおすすめする(ただしあまり
美しくはない)。

Closed #121
  • Loading branch information
lambdalisue committed Jul 13, 2014
1 parent 7583e10 commit 782057c
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 29 deletions.
21 changes: 8 additions & 13 deletions src/kawaz/apps/products/filters.py
@@ -1,26 +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

__author__ = 'giginet'

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

def _choices_with_deselect(qs):
"""
ModelChoiceFilterを利用すると、全ての指定ができなくなってしまう
そのため、このようにchoicesをquerysetから生成してChoiceFilterに渡している
"""
choices = [(query.pk, str(query)) for query in qs]
return [('', _('Any')),] + choices

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

class Meta:
model = Product
Expand Down
17 changes: 1 addition & 16 deletions src/kawaz/templates/products/product_list.html
Expand Up @@ -20,20 +20,5 @@ <h2>{% trans "Administration" %}</h2>
<a href="{% url "products_product_create" %}" class="btn btn-primary"><span class="glyphicon glyphicon-plus"></span> {% trans "Create Product" %}</a>
</div>
{% endif %}
<h2>{% trans "Categories" %}</h2>
<ul>
<li><a href="{% url "products_product_list" %}">{% trans "Any Category" %}</a></li>
{% get_categories as categories %}
{% for category in categories %}
<li><a href="{% url "products_product_list" %}?categories={{ category.pk }}">{{ category }}</a></li>
{% endfor %}
</ul>
<h2>{% trans "Platforms" %}</h2>
<ul>
<li><a href="{% url "products_product_list" %}">{% trans "Any Platform" %}</a></li>
{% get_platforms as platforms %}
{% for platform in platforms %}
<li><a href="{% url "products_product_list" %}?platforms={{ platform.pk }}">{{ platform }}</a></li>
{% endfor %}
</ul>
{{ filter.form.as_p }}
{% endblock %}

0 comments on commit 782057c

Please sign in to comment.