ページに分割する

ほとんどすべてのサイトでは、情報の出力をページに分割する必要があります。 あなたのページネーションを書くのに役立ついくつかの事柄がすでにこの中にありますが、私はこれを2行で見たことがありません。



ずっと前に持っていたものを作る方法のアイデアの利点である、私は1つを書くことにしました。 django-simplepaginationに会います。







ページネーターは本質的に、1つの条件でビューに重ねるデコレーターです。 条件は非常に単純で、ビューはHttpResponseではなく辞書を返す必要があります。 自作のrender_toデコレータを使用するか、 django-annoyingのいずれかを使用すると、ページネーションのすべての条件が満たされます。 その後、すべてが非常に簡単です。django-simplepaginationをインストールし、INSTALLED_APPSに「simplepagination」を追加して、ビューにデコレーターを配置します。 例:



from simplepagination import paginate

from annoying.decorators import render_to

from blog.models import Post



@render_to ( 'blog_posts.html' )

@paginate (style = 'digg' , per_page =15 )

def list_posts (request):

posts = Post . objects . all()

return { 'object_list' : posts}









さらに、テンプレート「blog_posts.html」に{%include paginator.template%}を挿入します。また、ベーステンプレートにpaginator.cssファイルを含めることを忘れないでください。



これで、diggページネーションのコピーの作成は終了します。



自然な問題は、ロジックとフォームが非常に複雑な3行のコードの1つであるdiggのページネータがどのように機能するかです。 説明しておくと、ページネーターのロジックは、いわゆるバックエンドで説明されています。 diggバックエンドはすでにアプリケーションに組み込まれていますが、バックエンドを作成したい人の例でもあります。 ロジックに加えて、htmlも必要です。もちろん、diggページネーター用のスタイルを持つcssのように、アプリケーションにも組み込まれています。



もちろん、あなたのサイトがページ編集者のdiggバージョンを使用する可能性は低いので、たとえば、Habrahabrのページネーションを使用するなど、バックエンドの作成方法を紹介します。



したがって、最初に行う必要があるのは、simplepagination.backends.Paginatorを継承するクラスを作成することです。 ロジック自体はpaginate関数の内部にあり、関数はクラス内にある必要があります。



from simplepagination.backends import Paginator



class HabrahabrPaginator (Paginator):

def paginate ( self , frame_size, number_of_pages, current_page):

output = {}

if current_page > 1 :

output[ 'prev' ] = current_page - 1

if current_page < number_of_pages:

output[ 'next' ] = current_page + 1

if current_page + frame_size - 1 < number_of_pages:

output[ 'last' ] = number_of_pages

if current_page - frame_size + 1 > 1 :

output[ 'first' ] = 1

if number_of_pages <= frame_size:

output[ 'pages' ] = range ( 1 , number_of_pages + 1 )

else :

output[ 'pages' ] = range ( max (current_page - frame_size + 1 , 1 ), min (current_page + frame_size, number_of_pages + 1 ))

return output









バックエンドがトリガーされた後、「paginator」という名前のこの出力は、ビューを返す辞書に追加され、それに応じてテンプレートに分類されます。



HabrからHTMLcssを削除するのはあなた次第です(同時に、クラス名にプレフィックスを付けて、既にサイトにある可能性のあるクラス名と一致しないようにします)。HTMLをpaginator_habrahabr.htmlとして保存し、保存したcssを接続します。



最後に行うことは、バックエンド辞書にバックエンドを追加することです。 サイトのsettings.pyを開き、次の行を追加します(クラスへのパスを目的のパスに変更します)。



PAGINATION_BACKENDS = {'habrahabr': 'path.to.HabrahabrPaginator'}



アプリケーションの機能はこれで終わりではありません。1つのサイトで複数のページネーションスタイルを使用できます。すべてのものには、特定のバックエンドの一般設定とデコレータに渡されるパラメータの両方で変更できるデフォルト設定があります。 settings.pyファイルを見て、設定の説明を読むことをお勧めします。



All Articles