diadia

興味があることをやってみる。自分のメモを残しておきます。

任意の情報だけを表示させる方法(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() 関数定義したものと同じことがわかる