Sitemap

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

6 min readJun 2, 2017

--

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

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

今日の成果

  • モデルの修正(中間テーブル回り)
  • 管理ページの実装

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.

--

--

No responses yet