埼玉在住エンジニアのナレッジ帳

webのエンジニアをやっており、日頃の開発で詰まったことについて残していきたいと思っています。https://ikujip.jpの開発も行っているため、そこで使った知識なども載せられればと思います。

list_displayのエラー「〜must be a list or tuple.」

Djangoのモデルでlist_displayってありますよね。
変更リストページでどの項目を表示させるかを選択するオプションです。

これを書く時、以下のように書いた結果、

list_display = ('title')

こんなエラーが出ました。

django.core.exceptions.ImproperlyConfigured: 'voteadmin.list_display' must be a list or tuple.

list_displayはリスト型かタプル型で書けと怒られてます。

これの解決方法は至って簡単でした。
以下のように書けばよかったんですね。

list_display = ('title',)

または

list_display = ['title']

Djangoのモデル作成時に項目にNOT NULLをつけない

pythonのモデル(model)作成時、
各項目に属性を設定できますよね。

この時作成されるSQLDDLについて、
項目のNOT NULL制約有無をどうやってつけるのか詰まっていたのですが、
以下のようにして解決できました。

まず、pythonのモデルでは何も指定しない場合、
デフォルトでNOT NULL制約がつきます。
NOT NULL制約をつけたくない場合は、
「null=True」をつければできました。
簡単に例を書いてみます。

class test_table(models.Model):
        test = models.CharField(max_length=512, null=True)

どこかのサイトを見ていると、「required=True」とか「required=False」を
つければ.....、のようなことを書いてましたが、
実践してみると以下のようなエラーがでました。

TypeError: __init__() got an unexpected keyword argument 'required'

特に検証していないのですがバージョンの違いでしょうか...?
とりあえずは「null=True」を入れれば解決。

FC2ブログで記事の直下にアフィリエイトリンクを貼る

私はFC2ブログでも記事を書いてますが、
アフィリエイト広告を載せています。
アフィリエイトはサイドメニューなどに載せてもいいですか、
きっと記事の下に毎回表示したいと考えている人もいるかと思います。
そんな人たちのために手順を共有しますので、参考にしていただきたいです。

①まずはPCの方からです。

テンプレートの設定→PC用のテンプレート管理へと進んでください。
するとHTML編集の画面が出てきます。
HTMLに慣れていない人は何が書いているが分からないと思いますが、
以下のようにすれば大丈夫なので、中身は特に気にしないでください。

まずはHTML文の中で「%topentry_more」という文字を検索してください。
すると以下のような一文が見つかります。

<div id="more"><%topentry_more></div>

ここの下に以下のようにタグを埋め込んでください。

<div align="center">
  「〜ここに広告のリンクを貼付けてください〜」
</div>

上記のようにすればOKです。

②次にスマートフォンの方です。

これはほとんどPCと同じです。

テンプレートの設定→スマートフォン用のテンプレート管理へと進んでください。
PCの時と同様にHTML編集の画面が出てきます。
先ほどと同様、HTML文の中で「%topentry_more」という文字を検索してください。
すると以下のような一文が見つかります。

<div class="entory_more" id="more<%topentry_no>">
  <%topentry_more>
</div>

あとは先ほどと同様に上記の下に下記のようにタグを埋め込んでください。

<div align="center">
  「〜ここに広告のリンクを貼付けてください〜」
</div>

これでOKです!

Macでキャプチャを撮る

今回はWebアプリとは関係ない話ですが、
Macでキャプチャを取得する時のショートカットについてです。

私はよくホームページに画像を挿入するのですが、
その時にずっとskitchでキャプチャを取っていました。
しかし、skitchで取った場合はいつもフォルダに格納する手間がかかって面倒だと感じてました。
(ただし、キャプチャを取った後に大きさを変更できる点に関してはskitchはとても便利です。)
そこで何か便利なツールはないかと探していたのですが、
なんとMacのデフォルトのショートカットでキャプチャが取れるんですね。

しかも取得したキャプチャはデスクトップに保存されます。

以下にショートカットを共有しておきます。
(多分知っている方ばかりだと思いますが。)

・デスクトップ全体のキャプチャ取得
→Command + Shift + 3

・範囲を選択してキャプチャ取得
→Command + Shift + 4

・メニューや画面単位でキャプチャ取得
→Command + Shift + 4 を押して範囲選択モード時に Space

WPML Multilingual CMSでリダイレクトされてしまう問題

WPMLはWordPressで多言語対応する時に最も有名なプラグインですね。
僕も業務でこのプラグインを用いた対応を行ったのですが、ブラウザの言語でリダイレクト設定をし、日本語を母国語として設定した状態で他の言語を選択すると1回目はなぜか反映されないという事象が発生しました。
プラグインのバージョンは3.3.7でした。
ソースを読むと以下の修正をしたことでリダイレクトしなくなりました。
ご参照ください。
元々ブラウザのリダイレクトはSEOの観点からは良くないようなので、そこは気をつけて設定してください。
プラグインの「browser-redirect.js」を変更してください。(58行目あたりで、ソースはsitepress-multilingual-cms/res/js/にあります。)

if (false !== redirectUrl) {
    self.setCookie(browserLanguage);
    window.location = redirectUrl;
    break;
}

となっている箇所を、

if (false !== redirectUrl) {
    self.setCookie(browserLanguage);
    // ここから
    if((browserLanguage == 'ja' || browserLanguage == 'ja-JP' || browserLanguage == 'ja-jp') && (pageLanguage != 'ja' && pageLanguage != 'ja-JP' && pageLanguage != 'ja-jp')) {
        break;
    }
    // ここまで
    window.location = redirectUrl;
    break;
}

とすれば大丈夫です。
browserLanguageが「ja」、「ja-JP」、「ja-jp」と3種類ありますが、これはブラウザの種類によって表記が変わるためです。
僕が調べた限りではこの3種類をやっておけば主要ブラウザ全てに対応できました。

MySQLWorkbenchでER図(モデル)からDBを作成 – フォワードエンジニアリング

ti-tomo-knowledge.hatenablog.com

前回は上記の記事でDBからER図(モデル)を作成する
リバースエンジニアリング」について書きましたが、
ここではその逆である、
フォワードエンジニアリング」について書こうと思います。

MySQLのER図では、下記のように新規でテーブルを作成したり
編集したりすることができます。
もちろんテーブル同士の相関関係も作成できます。

f:id:tomotomo1129:20180521172538j:plain

そこでこのモデルをDBに適用するためには、以下の手順で進みます。

まずは上記の画面の状態で、
「Database」→「Forward Engineer..」と進みます。

すると適用するDBを設定する画面になります。
この辺の設定は「リバースエンジニアリング」と同じ要領で進めてください。

f:id:tomotomo1129:20180521172548j:plain

テーブル作成にあたってオプションを指定する画面が出てきますが、
特にオプションが必要なければ何もチェックをせずに進んで大丈夫です。

f:id:tomotomo1129:20180521172613j:plain

次に作成対象となるオブジェクトをチェックするページが現れますので、
自分が作成するオブジェクトに合わせてチェックを入れてください。
テーブルだけならデフォルトで大丈夫なはずです。

f:id:tomotomo1129:20180521172625j:plain

するとCREATE文などのDDL文が書かれた画面が表示されます。

f:id:tomotomo1129:20180521172634j:plain

そのまま「Continue」を押すとDDL文が実行され、DBに変更が適用されます。

MySQLWorkbenchでDBからER図(モデル)を作成 – リバースエンジニアリング

ここのページでは、
MySQLWorkbenchでDBからER図を作成する手順を共有します。
いわゆるリバースエンジニアリングという手順です。
Workbenchとは、MySQLの管理ツールとして有名です。

メリットとして挙げられることは、
phpMyAdmin」と違っていちいちブラウザを開く必要がないこと等、
いくつか挙げられますが、私はER図が用意に使えるが大きなメリットと
思っています。

WorkbenchでER図を使えないなら、他の管理ツールである「Sequel Pro」
の方が使いやすいと思っているくらいです。

さて、本題に入りますが、ER図の作成手順です。
ちなみにWorkbenchのバージョンは6.0.9です。

以下のようなクエリ実行画面で、
「Database」→「Reverse Engineer..」と進んでください。

f:id:tomotomo1129:20180521082005j:plain

DBへの接続設定画面が表示されるので、
「Stored Connection」のセレクトボックスで、
自分が設定を保存しているDBの設定名を選択してください。

f:id:tomotomo1129:20180521082031j:plain

「continue」を押して進んで行くと、
接続するDBスキーマの選択画面に進みます。

f:id:tomotomo1129:20180521082117j:plain

ここで接続するDBスキーマを選択して、
後はひたすら「continue」を押して進んでください。
そうすればなんとER図が作成されているではありませんか。

f:id:tomotomo1129:20180521082152j:plain

これで各テーブルの相関関係が理解しやすくなります。
ちなみにテーブル同士を繋いでいる線にポインタを当てると、
線の色が変わって、各テーブルのどの項目同士に相関関係があるのかが
分かりやすくなります。