はじめに
こんにちは。@toamoku-20220418と申します。現在Djangoを使用したアプリケーションの作成を目標に、勉強を進めております。
今回は「Djangoで2つのアプリケーションを利用してみる!!」の第2回となります。第1回をまだご覧いただいていない方はぜひそちらからご覧いただけると、より理解が深まると思います。
ぜひ最後までご覧いただき、皆さんの参考になれば幸いです。
前提条件
前回からの続きということで、ディレクトリやファイルを作成するコードは省かせていただきます。こちらではコードの解説に重きを置いて解説をしていきたいと思います。
app2のモデルとフォームを作成
app2のBookモデルを作成します。
# app2/models.py
from django.db import models
from app1.models import Author
class Book(models.Model):
title = models.CharField(max_length=200)
# authorを外部キーに指定。Author削除時にBookも削除。
author = models.ForeignKey(Author, on_delete=models.CASCADE)
published_date = models.DateField()
# Bookを文字列として表示するとき、タイトルを返す
def __str__(self):
return self.title
BookFormを作成
# app2/forms.py
from django import forms
from .models import Book
class BookForm(forms.ModelForm):
class Meta:
model = Book
fields = ['title', 'author', 'published_date']
app2のルーティング
myprojectディレクトリにあるurls.pyを編集する
# myproject/urls.py
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('app1/', include('app1.urls')),
# app2で始まるURLはapp2のurls.pyで行う
path('app2/', include('app2.urls')), # ここを追加
path('', views.home, name='home'),
]
app2のurls.pyを編集
# app2/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('books/', views.BookListView.as_view(), name='book-list'),
path('books/<int:pk>/', views.BookDetailView.as_view(), name='book-detail'),
path('books/new/', views.BookCreateView.as_view(), name='book-create'),
]
app2のHTMLファイルを作成
templatesフォルダに新しくapp2ディレクトリを作成し、HTMLファイルを配置します。
最初にbookリストを表示するbook_list.htmlを作成します。
<!-- templates/app2/book_list.html -->
{% extends "base.html" %}
{% block content %}
<h1>書籍一覧</h1>
<ul>
{% for book in object_list %}
<li><a href="{% url 'book-detail' book.pk %}">{{ book.title }}</a> by {{ book.author.name }}</li>
{% endfor %}
</ul>
<a href="{% url 'book-create' %}">新書登録</a>
{% endblock %}
続いて詳細画面を作成します。
<!-- templates/app2/book_detail.html -->
{% extends "base.html" %}
{% block content %}
<h1>{{ object.title }}</h1>
<p>作者: {{ object.author.name }}</p>
<p>出版日: {{ object.published_date }}</p>
<a href="{% url 'book-list' %}">書籍一覧へ戻る</a>
{% endblock %}
最後に新規作成画面を作成します。
<!-- templates/app2/book_form.html -->
{% extends "base.html" %}
{% block content %}
<h1>新書登録</h1>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">登録</button>
</form>
{% endblock %}
base.htmlの修正
base.htmlを編集し、bookリスト表示画面へ遷移するようにします。
<header>
<!-- ここのBooks部分のaタグを修正 -->
<h1><a href="{% url 'author-list' %}">Authors</a> | <a href="{% url 'book-list' %}">Books</a></h1>
</header>
Bookモデルのマイグレーション
Bookモデルをマイグレーションして、DBに反映させます。
python manage.py makemigrations app2
python manage.py migrate
ここまでのディレクトリ構成
myproject/
├── app1/
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── forms.py
│ ├── migrations/
│ │ └── __init__.py
│ ├── models.py
│ ├── urls.py
│ ├── tests.py
│ └── views.py
├── app2/
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── forms.py
│ ├── migrations/
│ │ └── __init__.py
│ ├── models.py
│ ├── urls.py
│ ├── tests.py
│ └── views.py
├── myproject/
│ ├── __init__.py
│ ├── asgi.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
└── templates/
├── app1/
│ ├── author_list.html
│ ├── author_detail.html
│ └── author_form.html
├── app2/
│ ├── book_list.html
│ ├── book_detail.html
│ └── book_form.html
├── base.html
└── home.html
動作確認
app1と同様に動作確認を行う。基本的には一緒です。もし間違いなどございましたら、ご連絡いただけると幸いです。
最後に
最後までお付き合いいただき、ありがとうございます。皆さんのDjangoの理解を深めることに少しでもお役に立てると幸いです。これからも引き続き記事を投稿していきたいと思いますので、これからもよろしくお願いします。それではまた次回の記事でお会いしましょう。