Djangoジェネリックビューでテーブルをフィルタリングするにはどうすればよいですか?

Joel Aufrecht

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.pyfrom .filters import AuthorFilter

そして今AuthorFilterFormHelperは定義されておらず、それが行によって暗示されるように明示的に定義する必要があるのか​​(どのように?)formhelper_class = FooFilterFormHelper、またはそれが実際に何らかの方法で実際に自動的に行われるべきかどうかは明確ではありませんself.filter.form.helper = self.formhelper_class()そして、まだurls.pyやテンプレートを取得していません。空白を埋めるのを手伝うか、一般的なクラスベースのビューにフィルタリングを追加するためのより良いパスを示してください。

Joel Aufrecht

試行錯誤と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.pydjango_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]

編集
0

コメントを追加

0

関連記事

分類Dev

データグリッドビューをテキストでフィルタリングするにはどうすればよいですか?

分類Dev

オブジェクトのキーと値でオブジェクトをフィルタリングするにはどうすればよいですか?

分類Dev

配列をフィルタリングしてテーブルビューを更新するにはどうすればよいですか?

分類Dev

Core Dataにオブジェクトがあるテーブルビューをフィルタリングするにはどうすればよいですか?

分類Dev

すでにネイティブiOSアプリをビルドするためのシンプルな3Dオブジェクトビューアコンポーネントを作成するにはどうすればよいですか?

分類Dev

Django:ページ全体を更新せずにフィルタリング後にテーブルを更新するにはどうすればよいですか?

分類Dev

フィルタリングされたIDでツリービューをフィルタリングするにはどうすればよいですか?

分類Dev

TypeScriptでジェネリック型で型のリストをフィルタリングするにはどうすればよいですか?

分類Dev

PowerShellで、ネストされたプロパティのキー/値オブジェクトでオブジェクトをフィルタリングするにはどうすればよいですか?

分類Dev

Djangoでクエリオブジェクトを日付範囲でフィルタリングするにはどうすればよいですか?

分類Dev

Reactで状態配列でデータオブジェクトをフィルタリングするにはどうすればよいですか?

分類Dev

Bootstrap-Vue:テーブルコンポーネントでチェックボックスを使用してデータをフィルタリングするにはどうすればよいですか?

分類Dev

グリッドビューでテーブルを表示するにはどうすればよいですか?

分類Dev

オブジェクトの特定のキーに対応する値をフィルタリングするにはどうすればよいですか?

分類Dev

パラメータの値でPHPのオブジェクト配列をフィルタリングするにはどうすればよいですか?

分類Dev

Djangoで、クエリセットフィルターを大きなグループまたはオブジェクトのすべてのメンバーに適切に追加するにはどうすればよいですか?

分類Dev

すべてのスキーマバインドビュー(および「フィルター処理されたインデックス」のようなテーブルの切り捨てを防ぐ他のオブジェクト)をスクリプト化するにはどうすればよいですか?

分類Dev

Primefacesレイジーデータテーブルでフィルタリングされた値を取得するにはどうすればよいですか?

分類Dev

Androidリアクティブプログラミングで、フィルターを適用した後にストリーミングオブジェクトデータを分割するにはどうすればよいですか?

分類Dev

ダッシュボードのシートをクリックするときにツールチップでテーブルをフィルタリングするにはどうすればよいですか?

分類Dev

クラスベースのビューでManyToManyクエリをフィルタリングするにはどうすればよいですか?

分類Dev

追加のフィールドでDjangoクエリセットをフィルタリングするにはどうすればよいですか?

分類Dev

カスタムDjangoジェネリックビューのテストを作成するにはどうすればよいですか?

分類Dev

djangoのフィールドオブジェクトに多数のクエリセットをフィルタリングするにはどうすればよいですか?

分類Dev

複数のselect2ボックスを使用してテーブルをフィルタリングするにはどうすればよいですか?

分類Dev

複数のテーブルでフィルタリングするEFコアクエリを作成するにはどうすればよいですか?

分類Dev

ディレクトリのフィルタリングされたビューを作成するにはどうすればよいですか?

分類Dev

LodashまたはプレーンJavaScriptを使用して動的フィルターでネストされたオブジェクトをフィルタリングするにはどうすればよいですか?

分類Dev

ジェネリックレコードおよびテーブルタイプで「InsertQuery」を使用するにはどうすればよいですか

Related 関連記事

  1. 1

    データグリッドビューをテキストでフィルタリングするにはどうすればよいですか?

  2. 2

    オブジェクトのキーと値でオブジェクトをフィルタリングするにはどうすればよいですか?

  3. 3

    配列をフィルタリングしてテーブルビューを更新するにはどうすればよいですか?

  4. 4

    Core Dataにオブジェクトがあるテーブルビューをフィルタリングするにはどうすればよいですか?

  5. 5

    すでにネイティブiOSアプリをビルドするためのシンプルな3Dオブジェクトビューアコンポーネントを作成するにはどうすればよいですか?

  6. 6

    Django:ページ全体を更新せずにフィルタリング後にテーブルを更新するにはどうすればよいですか?

  7. 7

    フィルタリングされたIDでツリービューをフィルタリングするにはどうすればよいですか?

  8. 8

    TypeScriptでジェネリック型で型のリストをフィルタリングするにはどうすればよいですか?

  9. 9

    PowerShellで、ネストされたプロパティのキー/値オブジェクトでオブジェクトをフィルタリングするにはどうすればよいですか?

  10. 10

    Djangoでクエリオブジェクトを日付範囲でフィルタリングするにはどうすればよいですか?

  11. 11

    Reactで状態配列でデータオブジェクトをフィルタリングするにはどうすればよいですか?

  12. 12

    Bootstrap-Vue:テーブルコンポーネントでチェックボックスを使用してデータをフィルタリングするにはどうすればよいですか?

  13. 13

    グリッドビューでテーブルを表示するにはどうすればよいですか?

  14. 14

    オブジェクトの特定のキーに対応する値をフィルタリングするにはどうすればよいですか?

  15. 15

    パラメータの値でPHPのオブジェクト配列をフィルタリングするにはどうすればよいですか?

  16. 16

    Djangoで、クエリセットフィルターを大きなグループまたはオブジェクトのすべてのメンバーに適切に追加するにはどうすればよいですか?

  17. 17

    すべてのスキーマバインドビュー(および「フィルター処理されたインデックス」のようなテーブルの切り捨てを防ぐ他のオブジェクト)をスクリプト化するにはどうすればよいですか?

  18. 18

    Primefacesレイジーデータテーブルでフィルタリングされた値を取得するにはどうすればよいですか?

  19. 19

    Androidリアクティブプログラミングで、フィルターを適用した後にストリーミングオブジェクトデータを分割するにはどうすればよいですか?

  20. 20

    ダッシュボードのシートをクリックするときにツールチップでテーブルをフィルタリングするにはどうすればよいですか?

  21. 21

    クラスベースのビューでManyToManyクエリをフィルタリングするにはどうすればよいですか?

  22. 22

    追加のフィールドでDjangoクエリセットをフィルタリングするにはどうすればよいですか?

  23. 23

    カスタムDjangoジェネリックビューのテストを作成するにはどうすればよいですか?

  24. 24

    djangoのフィールドオブジェクトに多数のクエリセットをフィルタリングするにはどうすればよいですか?

  25. 25

    複数のselect2ボックスを使用してテーブルをフィルタリングするにはどうすればよいですか?

  26. 26

    複数のテーブルでフィルタリングするEFコアクエリを作成するにはどうすればよいですか?

  27. 27

    ディレクトリのフィルタリングされたビューを作成するにはどうすればよいですか?

  28. 28

    LodashまたはプレーンJavaScriptを使用して動的フィルターでネストされたオブジェクトをフィルタリングするにはどうすればよいですか?

  29. 29

    ジェネリックレコードおよびテーブルタイプで「InsertQuery」を使用するにはどうすればよいですか

ホットタグ

アーカイブ