Django 1.6の最も一般的/標準/推奨されるアプローチを使用して、ページ付け、並べ替え、フィルタリングを備えたテーブルビューを作成しようとしています。これは、汎用クラスベースビューとdjango-tables2のようです。フィルタリングを追加する方法の例を少なくとも2つ見つけました。1つはdjango-filtersとcrispy-formsを使用し、もう1つはdjango_filtersを使用しますが、どちらにも完全な実例は含まれていません。どちらのアプローチにも従うと、不足している資料を埋めることができなくなります。Nicolas Kuttlerのクリスピーなアプローチを使用して、私は次のことを行います。
models.py
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
Tables.py
import django_tables2 as dt2
from .models import Author
class AuthorTable(dt2.Table):
class Meta:
model = Author
私が正しく理解していれば、PagedFilteredTableViewは、AuthorViewをサブクラス化する汎用クラスです。他の例では、FilteredSingleTableViewは、Authorがテーブルの場合、AuthorFilteredSingleTableViewのようなものとして理解されるはずです。
views.py
from .tables import AuthorTable
from .models import Author
from django_tables2 import SingleTableView
class PagedFilteredTableView(SingleTableView):
"""
Generic class from http://kuttler.eu/post/using-django-tables2-filters-crispy-forms-together/
which should probably be in a utility file
"""
filter_class = None
formhelper_class = None
context_filter_name = 'filter'
def get_queryset(self, **kwargs):
qs = super(PagedFilteredTableView, self).get_queryset()
self.filter = self.filter_class(self.request.GET, queryset=qs)
self.filter.form.helper = self.formhelper_class()
return self.filter.qs
def get_table(self, **kwargs):
table = super(PagedFilteredTableView, self).get_table()
RequestConfig(self.request, paginate={'page': self.kwargs['page'],
"per_page": self.paginate_by}).configure(table)
return table
def get_context_data(self, **kwargs):
context = super(PagedFilteredTableView, self).get_context_data()
context[self.context_filter_name] = self.filter
return context
class AuthorTableView(PagedFilteredTableView):
model = Author
table_class = AuthorTable
paginate_by = 30
filter_class = AuthorFilter
formhelper_class = AuthorFilterFormHelper
これは、テンプレートを除いて、ソースからのすべてのサンプルコードであり、manage.pyはAuthorFilterが定義されていないと文句を言っているので、それは...多分filters.pyに入ると思いますか?
filters.py
import django_filters as df
from .models import Author
class AuthorFilter(df.FilterSet):
class Meta:
model = Author
そして、戻ってviews.py
、from .filters import AuthorFilter
。
そして今AuthorFilterFormHelper
は定義されておらず、それが行によって暗示されるように明示的に定義する必要があるのか(どのように?)formhelper_class = FooFilterFormHelper
、またはそれが実際に何らかの方法で実際に自動的に行われるべきかどうかは明確ではありませんself.filter.form.helper = self.formhelper_class()
。そして、まだurls.pyやテンプレートを取得していません。空白を埋めるのを手伝うか、一般的なクラスベースのビューにフィルタリングを追加するためのより良いパスを示してください。
試行錯誤とNicolasKutlerからのいくつかの提案により、私は彼の例を機能させることができました。私は彼の例を少し虐待しましたが、これは、並べ替え、フィルタリング(したがって検索)、およびページ付けを備えた一般的なクラスベースのリストビューページを作成するためにDjangoで必要な最小限のコードに近いようです。 Djangoのコーディング慣行に違反しているとは思わないでください。必要なすべてのコードは次のとおりです。
models.py(質問からの変更なし)
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
そして、質問のtables.pyへのわずかな変更:
import django_tables2 as dt2
from .models import Author
class AuthorTable(dt2.Table):
class Meta:
model = Author
attrs = {"class": "paleblue"}
per_page = 30
filters.py(質問からの変更はありません)
import django_filters as df
from .models import Author
class AuthorFilter(df.FilterSet):
class Meta:
model = Author
forms.py。django_filtersからフォーム送信ボタンを他のすべてと組み合わせて取得する方法/場所がわからなかったため、このコードはフォームラッパータグをクリスピーから抑制し、テンプレートでそのHTMLを提供します。これはおそらく最も巧妙ですこの一部。
from django import forms
from .models import Author
from crispy_forms.helper import FormHelper
class AuthorListFormHelper(FormHelper):
model = Author
form_tag = False
ヘルパー関数をviews.pyから別のファイルに移動し、エラーを防ぐためにページ付けコードを削除する必要がありました(ページ付けは引き続き機能します)。そう、
utils.py
from django_tables2 import SingleTableView
from django_tables2.config import RequestConfig
class PagedFilteredTableView(SingleTableView):
filter_class = None
formhelper_class = None
context_filter_name = 'filter'
def get_queryset(self, **kwargs):
qs = super(PagedFilteredTableView, self).get_queryset()
self.filter = self.filter_class(self.request.GET, queryset=qs)
self.filter.form.helper = self.formhelper_class()
return self.filter.qs
def get_context_data(self, **kwargs):
context = super(PagedFilteredTableView, self).get_context_data()
context[self.context_filter_name] = self.filter
return context
質問のviews.pyの代わりに、このviews.py:
from .models import Author
from .tables import AuthorTable
from .filters import AuthorListFilter
from .forms import AuthorListFormHelper
from utils import PagedFilteredTableView
class AuthorList(PagedFilteredTableView):
model = Author
table_class = AuthorTable
filter_class = AuthorListFilter
formhelper_class = AuthorListFormHelper
そしてこのテンプレート:
author_list.html(ビュー内のモデルによって暗示されているため、名前はどこにも明示的に指定されていないと思います)
{% extends "base.html" %}
{% load render_table from django_tables2 %}
{% load crispy_forms_tags %}
{% block content %}
{% render_table table %}
<hr/>
<form action="" method="get">
{% crispy filter.form filter.form.helper %}
<input type="submit" value="Filter"/>
</form>
{% endblock content %}
そして、完全を期すために、urls.pyの行:
...
url(r'^$', views.AuthorTableList.as_view(), name='author_table'),
...
また、パッケージdjango-tables2、django-filters、およびcrispy-formsをインストールし、指示に従って構成する必要があります。私をつまずかせた1つのことは、最初の試みで、settings.pyでこれが必要であることをどういうわけか見逃したことでした。
CRISPY_TEMPLATE_PACK = 'bootstrap'
これはすべてDjango1.6用です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加