任意の情報だけを表示させる方法(ListView)
問題点
例えば、ブログの下書きと公開記事があるとする。
これを任意に表示させるようにしたい。
具体的にはBooleanFieldを使ってチェックマークをつけたものだけ下書きとして集めて下書き一覧ページを作りたい。
条件としてはListViewで表示させること。
今回解決の糸口となったURL
DjangoのモデルのManagerクラスのメソッドをメソッドチェインさせる - kk6のメモ帳*
編集前参考コード
models.py
class Blog(models.Model): title = models.CharField(max_length=120) content = models.TestField() image = models.ImageField(upload_to="media/", blank=True, null=True) private = models.BooleanField(default=True)
views.py
class BlogListView(models.ListView) model = Blog
___________________________________________________________________________________
解決案
モデルマネージャーなるものを使うことで、表示させるものを絞ることができる。
models.py
#①新たにブログマネージャを規定する class BlogManager(models.Manager): def check_private(request) return Blog.objects.filter(private=True) # Blog.objects == self.get_querysetだから以下でも成り立つ '''class BlogManager(models.Manager): def check_private(self) return self.get_queryset.filter(private=True)''' class Blog(models.Model): title = models.CharField(max_length=120) content = models.TestField() image = models.ImageField(upload_to="media/", blank=True, null=True) private = models.BooleanField(default=True) #②下記一文を追加する objects = BlogManager()
views.py
class BlogListView(ListView) #③ model = Blog この一文は不要になるので削除 #④ 代わりにdefで定義する def list_view(request): return Blog.objects.check_private() # modelManagerで定義した関数を後ろにつけるだけ #もちろんこれでも通用する Return blog.objects.filter(private=True)
ポイント:
model.Managerを使うのが解決の糸口になった。
models.py ではmodelmanager で抽出したい情報のみを集めて、それを定義する。またデータベースにobjects = hogeManagerと追加することも忘れない。
views.py ではListView でmodel = hogeの一文を削除し、代わりにクエリセットした内容にmodelsManagerで定義した関数をメソッドとして加えてやること。
+α
shell上のクエリセットでプライベートのみ出す方法は以下になる。
qs = Blog.objects.filter(private= True)
Blog.objects.check_private() 関数定義したものと同じことがわかる