割烹エディターβ版リリースメモ5(お知らせ機能の追加)

運営用の機能として結構大事なものにお知らせがあります。

仕様が変わったり、不具合だったり、メンテナンスだったり、運営側で何かしらのアクションを取る場合にユーザーへ周知するための機能です。

ということで割烹エディターにもお知らせ機能を付けていきます。

アプリケーションの作成

python manage.py startapp info

settings.pyにアプリを追加

'info.apps.InfoConfig',

準備ができました。

モデルの作成

次はモデルを作っていきます。

Informationモデルを作ります。

必要なのは

・タイトル
・本文
・カテゴリー:(別テーブル)
・発行者:(ログインユーザー)
・作成日
・更新日
・公開フラグ

の7つですかね。

カテゴリーはお知らせのタイプとして設定できるように別テーブルで管理します。発行者はログインしているユーザーですね。ただ決められた人しか作れないようにあとで設定しておきます。

カテゴリーは管理ページで作ります。種類としては

・お知らせ
・不具合・障害
・機能追加
・メンテナンス

かな、タイトルに入れてもいいけど

info/models.py

from django.db import models
from django.conf import settings

class Category(models.Model):
   name = models.CharField('カテゴリー', max_length=32)

   def __str__(self):
       return self.name

class Information(models.Model):
   author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
   title = models.CharField('タイトル', max_length=100)
   text = models.TextField('本文')
   category = models.ForeignKey(Category, on_delete=models.PROTECT)
   created_date = models.DateTimeField(default=timezone.now)
   update_date = models.DateTimeField(blank=True, null=True)
   valid = models.BooleanField()

   def __str__(self):
       return self.title

こんな感じかな。adminにも追加。

from django.contrib import admin
from .models import Category, Information

admin.site.register(Category)
admin.site.register(Information)

管理サイトにログインしてみると。

キャプチャ

できてますね。

カテゴリーを追加しておきましょう。

キャプチャ2

URLの設定

素体ができたので次にURLを設定していきます。まずはプロジェクトのurls.pyから

   path('site/', include('info.urls')),

次に一覧と詳細のURLです。info/urls.py

   path('info/list/', views.InfoList.as_view(), name='info_list'),
   path('info/detail/<int:pk>', views.InfoDetail.as_view(), name='info_detail'),

Viewの設定

class InfoList(generic.ListView):
   queryset = Information.objects.filter(valid=True).order_by('-update_date')
   paginate_by = 10

class InfoDetail(generic.DetailView):
   model = Information

Listの方はフィルターでvalidが有効な物、あと、更新日時が新しいものから並べます。また一ページ10個まで。

Templateの設定

template_nameを指定しない場合はデフォルトでtemplates/info/Information_list.html、templates/info/Information_detail.htmlが呼ばれます。<model>_xxxっていう名付けルールが公式。

また、テンプレートに渡されるオブジェクトはinformation_listそれぞれ取り出す。またobjectでも取り出せる。どちらかと言えばこっちの方が汎用的か?

{% extends 'base.html' %}
{% load static %}
{% block header %}
   <link rel="stylesheet" href="{% static 'info/info.css' %}"
{% endblock %}
{% block content %}
   {% for info in information_list %}
           <p>{{ info.title }} :  {{ info.category }}</p>
       {% endfor %}
{% endblock %}

キャプチャ4

詳細の方はinformation

{% extends 'base.html' %}
{% load static %}
{% block header %}
   <link rel="stylesheet" href="{% static 'info/info.css' %}"
{% endblock %}
{% block content %}
   {{ information.title }}<br>
   {{ information.category }}<br>
   {{ information.author }}<br>
   {{ information.text }}<br>
   {{ information.created_date | date }}<br>
   {{ information.update_date | date }}<br>
   {{ information.valid }}<br>
{% endblock %}

キャプチャ3

CSSは適用していないのでこんな感じ。まぁあとは、有効な記事だけ表示する仕組みとCSSを付けたらこれで完了かな。

管理者しか更新しないので管理画面だけで作るようにします。

とりあえず機能としてはこれで完了。


良ければサポートお願いします。サポート費用はサーバー維持などの開発費に使わせていただきます。