5件ずつ記事のページを遷移する
ホームページで一度に見られる記事は5件までです。それより古い記事を見るためには、5件ずつ記事を遡るページ遷移の仕組みが必要です。これは、GETパラメータのselectにページ番号を指定することで実現します。たとえば、select=1なら最新の5件、select=2なら6件目から10件目の記事、といった形です。
home.pyファイルをコーディングする
5件ごとの記事のWebページを遷移するといっても同じhome.pyのWebページへ遷移します。ただしselectパラメータが違うので表示される記事のレコードが異なります。
新たに出てきたSQL文は「article」テーブルのレコード数(COUNT)を取得するだけです。「fetchone」メソッドで1レコードだけ取得します。カラムは配列に入れられるので「count[0]」にレコード数が取得できます。
import pages.etc as etc
def html(form,cur):
select = int(form.getfirst('select', '1'))
print('''
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>一筆書きBBS</title>
<link href="css/pc.css" rel="stylesheet" type="text/css" />
<link href="css/mobile.css" rel="stylesheet" type="text/css" media="only screen and (max-width:1023px)" />
<script type="text/javascript" src="js/main.js"></script>
</head>
<body>
<div id="left">
<header>
<h1>一筆書きBBS</h1>
<nav>
<a href="?page=home">HOME</a>
<a href="?page=draw">DRAW</a>
<a href="?page=about">ABOUT</a>
</nav>
</header>
<h2>記事</h2>
<ul>
''')
title = ''
speaker = ''
date = ''
ARTICLE_NUM = 5
data = (ARTICLE_NUM,(select-1)*ARTICLE_NUM)
sql = '''SELECT id,title,speaker,date FROM article ORDER BY id DESC LIMIT ? OFFSET ?''' #
for row in cur.execute(sql,data):
if row[0] != None:
id = row[0]
if row[1] != None:
title = etc.get_html(row[1])
if row[2] != None:
speaker = etc.get_html(row[2])
if row[3] != None:
date = row[3]
print('''
<li><a href="?page=comment&article_id={}">{}</a><br />{}<br />{}</li>
'''.format(id,title,date,speaker))
print('</ul>')
print('<div id="select">')
sql = 'SELECT COUNT(id) FROM article'
cur.execute(sql)
count = cur.fetchone()
for i in range(1,2+int((count[0]-1)/ARTICLE_NUM)):
if i == select:
print('<a href="?page=home&select={}" id="select_num">{}</a> '.format(i,i))
else:
print('<a href="?page=home&select={}">{}</a> '.format(i,i))
print('</div>')
etc.random_load(cur)
サンプルコードの解説
SQL文でarticleテーブルの「id」カラムのレコード数(COUNT)を取得(fetchoneメソッド)します。
記事の5件ずつのページ番号を1~ページの総数だけ繰り返しその番号のリンクをHTML5文書に出力します。ページ番号が現在のページの場合「#select_num」セレクタで背景色の黒いcssにします。
コラム「Webプログラミング」
コンパイラ言語である「Visual C++」が全盛だった時代からプログラミングに携わっていたため、当初は「インタプリタ言語は処理速度の面で実用的ではない」という先入観があり、Webアプリケーション開発を敬遠していた時期がありました。 しかし、現在はPythonやJavaScriptといったインタプリタ言語を中心に開発を行っています。Webアプリケーション開発への取り組みが遅れたことを少し後悔していますが、今やそれも昔の話かもしれません。
おわりに
今回は、一筆書きBBSのホームページ(トップページ)を作成しました。記事タイトルからコメントページへのリンク(?page=comment)を設置しましたが、まだindex.pyがこのpageパラメータに対応していないため、リンクをクリックしても(else節が実行され)ホームページが表示される状態です。
次回は、この記事一覧からリンクするコメントページを作成します。
