ユーニックス総合研究所

  • home
  • archives
  • python-django-linebbs-fix

Django入門: 微調整 ~ 簡単な一行掲示板アプリを作る その15【Windows10】

  • 作成日: 2020-10-27
  • 更新日: 2023-12-26
  • カテゴリ: Django

はじめに

この記事は「Djangoで一行掲示板を作ろう」という趣旨のシリーズの記事です。

前回までで一応、一行掲示板の形は整いました。

今回はこの掲示板の気になるところを微修正したいと思います。
気になるところとは投稿の並び順や、フォームの表示方法です。
これらを修正してスッキリさせたいと思います。

前提として開発環境のOSはWindows10, シェルはコマンドプロンプトです。
仮想環境を使っていますが、仮想環境については第一回の記事をご覧ください。
初期作業ディレクトリはプロジェクト内のmanage.pyのあるディレクトリです。

投稿の並び順の修正

今の掲示板は↓のような感じになっています。

掲示板利用者の投稿内容がずらっと並んでいますが、その並び順は下に行くほど新しくなっています。
これだと最新の投稿を見るのにブラウザを一番下までスクロールしなくてはいけません。
よって、この並び順を逆にして、上に行くほど新しい投稿にしといたほうが見易い気がします。

私も久しぶりに掲示板を作ったのですが、この投稿の並び順を見て最初は違和感を抱きませんでした。
ちょっと考えて、そういう仕様にした方がいいという結論になりました。

よってこれを修正したいと思います。
manage.pyのあるディレクトリからbbs\views.pyを開きます。
home_view_get()関数は現在は↓のようになっています。

def home_view_get(request, form=None):  
    """  
    パス bbs/ の GET  
    """  
    context = {}  # コンテキストを作成  

    context['title'] = '一行掲示板'  # ページのタイトル  
    context['posts'] = Post.objects.all()  # Postのリストを取得  

    if form:  
        context['form'] = form  
    else:  
        context['form'] = PostForm()  # フォームを保存  

    # renderにコンテキストを渡しテンプレートを描画  
    return render(request, 'bbs/home.html', context)  

注目したいのは↓の行です。

    context['posts'] = Post.objects.all()  # Postのリストを取得  

↑の部分で投稿の一覧(Postの一覧)を取得しています。
実はobjects以下の属性にはall()の他にも沢山の便利な関数があります。
その中の1つにorder_by()というものがあります。
これは取得するオブジェクトの並び順を変更する関数です。

↑の行を↓のように変更します。

    context['posts'] = Post.objects.order_by('-id').all()  # Postのリストを取得  

objectsall()の間にorder_by('-id')という処理を挟んでいます。
order_by()の返り値はdjango.db.models.query.QuerySetです。
QuerySetはフィルターを適用するようにorder_by()all()を呼び出すことが出来ます。
↑の場合だとorder_by()QuerySetを取得して、さらにそのQuerySetからall()を呼び出し、結果的にソートされたオブジェクトのリストを取得するようになっています。
これらは↓のコードと同じです。

queryset = Post.objects.order_by('-id')  
queryset = queryset.all()  
context['posts'] = queryset  

order_by()の引数にはソートのキーを指定します。
order_by('id')と指定するとorder_by()Postidを使って昇順でソートします。
これを反転させたい場合はキーの先頭に-を付けます。
つまりorder_by('-id')のようにするとPostidを使って降順でソートすることになります。

開発用サーバーで確認

これで投稿の並び順の修正は完了しました。
開発用サーバーを起動します。

> python manage.py runserver 0.0.0.0:8123  

特に問題が無ければ↓のように表示されます。

フォームの修正

次にフォームの微修正をします。
今現在のフォームは「Content:」などの英語や、「掲示板のポスト内容」などの日本語が混ざっていてどことなく不格好です。
これを修正するためbbs\forms.pyを開き↓のように編集します。

from django import forms  
from bbs.models import Post  


class PostForm(forms.ModelForm):  
    class Meta:  
        model = Post  
        fields = ('content', )  

        # ↓これを追加  
        labels = {  
            'content': '投稿内容',  
        }  

        # ↓これを追加  
        help_texts = {  
            'content': None,  
        }  

追加したのは↓の部分です。

        # ↓これを追加  
        labels = {  
            'content': '投稿内容',  
        }  

        # ↓これを追加  
        help_texts = {  
            'content': None,  
        }  

labels属性にフィールド名とそのラベル名を指定すると、フォームの部品のラベル名を設定できます。
このラベル名は「Content」と表示されていた部分です。これを「投稿内容」に変更します。
そしてhelp_texts属性に同様にフィールド名を指定し、Noneを与えるとフィールドのhelp_textを無効化することが出来ます。
help_textとは「掲示板のポスト内容」と書かれている部分です。これはmodels.pyPostで定義されていて、フォームが流用しているわけです。

↑の修正を加えて開発用サーバーを起動すると↓のような表示になります。

おわりに

今回は投稿の並び順とフォームの表示方法を微調整しました。
なかなかそれらしい掲示板になりましたね。
今回でこのシリーズは終了ですが、ぜひ開発した掲示板を改造して自分好みの掲示板にしてみてください。

🦝 < 健闘を祈る