Django を使って作っていく その2

2017年06月02日

どうもこんにちは。ごっちです。

ブログシステムを作っていっています。その活動ログ。

今日の成果

  • モデルの修正(中間テーブル回り)

  • 管理ページの実装

List ページ

タイトルのほかにタグリストも表示させました。

Edit ページ

別 Window が開いてタグの編集ができます。もう少しスマートにいけそうですけどね。

詰まったところ

やはり、多対多のテーブル構造をどうやって管理画面で編集できるようにするかで詰まりましたね。。。

ドキュメントを探していい具合に実装するのにかなり苦労した。。。

っで結局こうなりました。

blogs/models.py

from django.db import models

class Tag(models.Model):
    name = models.CharField(max_length = 30)

    def __str__(self):
        return self.name

class Post(models.Model):
    title = models.CharField(max_length = 30)
    body = models.TextField(max_length = 1000)
    # モデルで through を使うときはこんな感じに書くようです。
    # PostsTagを通じてTagと紐づかせます。
    tags = models.ManyToManyField(Tag, through='PostsTag')

    def __str__(self):
        return self.title

class PostsTag(models.Model):
    # お互いのモデルの外部キーを持っておきます。
    post = models.ForeignKey(Post)
    tag = models.ForeignKey(Tag)

blogs/admin.py

from django.contrib import admin

from .models import Post, PostsTag, Tag

class PostsTagInline(admin.TabularInline):
    model = PostsTag
    extra = 1

class PostAdmin(admin.ModelAdmin):
    # Postと同時にTagも編集できるようにInlineを設定する
    inlines = [PostsTagInline]
    list_display = ('title', '_tags') # ListViewでタグリストも表示できるようにする

    def _tags(self, post):
        return ','.join([tag.name for tag in post.tags.all()])

class TagAdmin(admin.ModelAdmin):
    inlines = [PostsTagInline]

# PostとTagをAdminで編集できるようにする。
admin.site.register(Post, PostAdmin)
admin.site.register(Tag, TagAdmin)

所感

中間テーブルで Through させておけば、 register の設定しなくてもいいかなぁと思ってたけど、そんなことはなかった。というところですね。。。

次はアプリページのビューを作っていこ。

References

Originally published at gist.github.com.

ProfilePicture

Yuta Goto

フリーランスのソフトウェアエンジニアです。現在はReact.jsを使用したWebフロントエンドの開発やRuby on Railsを使用したサーバサイドの開発を行っています。