割烹エディターβ版リリースメモ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)
管理サイトにログインしてみると。
できてますね。
カテゴリーを追加しておきましょう。
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 %}
詳細の方は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 %}
CSSは適用していないのでこんな感じ。まぁあとは、有効な記事だけ表示する仕組みとCSSを付けたらこれで完了かな。
管理者しか更新しないので管理画面だけで作るようにします。
とりあえず機能としてはこれで完了。
良ければサポートお願いします。サポート費用はサーバー維持などの開発費に使わせていただきます。