diadia

趣味のプログラムを書く 

任意の情報だけを表示させる方法

例えば、ブログの下書きと公開記事があるとする。
これを任意に表示させるようにしたい。
その場合には、BooleanFieldを使ってチェックマークをつけたものだけ下書きとして下書き一覧ページにだけ現れるようにしたい。

ただこの場合のやり方が分からない。
どうすればいいのか?

queryset を使ってやればいいんじゃないか?
例えば 
Blog.objects.filter(private)
としたらどうだろうか?
shell でこの結果がわからないから調べてみる。
やり方としては、
Blog.objects.filter(private=True)
これでprivateのみの情報を抽出することが出来た。
あとはこの結果だけをListViewで表現することはどうやってやるのか調べてみたい。


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)


______________________________________________

どうやらモデルマネージャーというものがあるらしい。
モデルのうち欲しいものだけを抽出する方法が可能らしい。コードを調べてみる。
参考url
DjangoのモデルのManagerクラスのメソッドをメソッドチェインさせる - kk6のメモ帳*

django detailページ書き方(views.py)

詳細ページの書き方は複数ある。
detailviewを使って速く簡単に作ってしまう方法やrenderを使ってどのようなプロセスで動くか分かる方法もある。
(参考)



ブラックボックス化を避けるためrenderをベースとして、データベースにアクセスするような動きを見せながらwebページを表示させる方法を書こうと思う。

from django.shortcuts import render 
from django.http import Http404

def produc_detail_page(request)
    qs = Product.objects.filter(id=pk)
    if qs.exist() and qs.count()==1:    
        instance = qs.first
    else:
        raise Http404("product does not exist.")
    context = { "object" : instance}
    return render(request, "products/detail.html" , context)

コードの意味
全体:
データベースにidをもとに情報を検索して、それがある場合のみ、その情報を
表示させる。

models.py FileFieldのメモ

自分の疑問点とその答えをメモする。

まずこれがあるとファイルをフォームから保存することができる。
またそれはデータベースの一部になる。

image = FileField(upload_to="media/")
この場合のmedia/は一体なんなのか?

get_object_or_404 detailページにつけるやり方

全然分かってないのでメモ。
ドキュメント
https://docs.djangoproject.com/ja/2.0/topics/http/shortcuts/#get-object-or-404

Calls get() on a given model manager, but it raises Http404 instead of the model's DoesNotExist exception.
引数はklass, **kwargsのふたつ

renderを使ってページを表示させる場合には以下のように処理したいた。
views.py

from django.shortcuts import render

def test(request, pk):
    object = Product.objects.get(id=pk)
    context = {"object": object}
    render(request, 'TEST/test.html', context ) 

こんな感じで、必要なpkをrequestに追加して書くことでほしいデータの詳細ページを表示させる事ができる。

get_object_or_404を使うとobject = test.objects.get(pk=pk)という一文の機能も兼ねることになるので、その一文は書かなくて良い。



views.py にて

from django.shortcuts import render, get_object_or_404
def product_detail_view(request, pk):
    object = get_object_or_404(klass , pk=pk)
    context = {"object": object}
    render(request, 'TEST/test.html', context ) 


このやり方の他にHttp404を使う方法でも404エラーを表示できることがわかった。上の方法よりどうしてエラーが出たのかわかりやすくなったと思う。

from django.http import Http404
from django.shortcuts import render


def product_detail_view(request,pk)

    try:
        instance = Product.objects.get(pk=pk)
    except Product.DoesNotExist:
        print("no product here")
    except:
        print("?")

    context = {"object":instance}  
return render(request, "TEST/test.html",context)


もっとデータベースからwebページを表示させてる感を出すには以下の方法を取る。

def product_detail_view(request, pk)
    queryset = Product.objects.filter(id=pk)
    if queryset.exist() and queryset.count() ==1:
        instance = queryset.first()

クラス別汎用ビューまとめ

クラス別汎用ビュー俯瞰
クラス別汎用ビュー俯瞰 - diadia

簡単にリストを一覧表示させる方法(List_View)
ListViewの内容を一覧表示させる方法 - diadia

使い方メモUpdateView
UpdateView 使い方メモ - diadia

クラス汎用ビューで使うテンプレート名を指定する
クラス汎用ビューでテンプレート名を指定する - diadia

使い方メモDeleteView
クラス別汎用ビュー DeleteView - diadia

ListViewの内容を一覧表示させる方法

よく忘れるのでメモ。

List_Viewで表示させる方法は、いくつかあって簡単な方法を記録する。

{{ object_list }}
こうすると表示は
<QuerySet,
となってしまう。

これを

{% for obj in object_list %}
{{ obj.title }}
{{ obj.contents }}
{% endfor %}
こうするとquerysetとか無駄な記号を省いて表示することができる。