第２回：Djangoで2つアプリケーションを利用してみる！！

## はじめに
　こんにちは。@toamoku-20220418と申します。現在Djangoを使用したアプリケーションの作成を目標に、勉強を進めております。
　今回は「Djangoで2つのアプリケーションを利用してみる！！」の第２回となります。第１回をまだご覧いただいていない方はぜひそちらからご覧いただけると、より理解が深まると思います。
　ぜひ最後までご覧いただき、皆さんの参考になれば幸いです。

 https://qiita.com/toamoku-20220418/items/ce87c281142ffe95ceaf

## 前提条件
　前回からの続きということで、ディレクトリやファイルを作成するコードは省かせていただきます。こちらではコードの解説に重きを置いて解説をしていきたいと思います。

## app2のモデルとフォームを作成

　app2のBookモデルを作成します。

```python:models.py
# 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を作成

```python:forms.py
# 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を編集する

```python: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を編集

```python: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を作成します。

```html: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 %}
```

　続いて詳細画面を作成します。

```html:book_detail.html
<!-- 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 %}
```

　最後に新規作成画面を作成します。

```html:book_form.html
<!-- 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リスト表示画面へ遷移するようにします。

```html:base.html
<header>
    <!-- ここのBooks部分のaタグを修正 -->
    <h1><a href="{% url 'author-list' %}">Authors</a> | <a href="{% url 'book-list' %}">Books</a></h1>
</header>
```

## Bookモデルのマイグレーション

　Bookモデルをマイグレーションして、DBに反映させます。

```bash
python manage.py makemigrations app2
python manage.py migrate
```

## ここまでのディレクトリ構成

```bash
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の理解を深めることに少しでもお役に立てると幸いです。これからも引き続き記事を投稿していきたいと思いますので、これからもよろしくお願いします。それではまた次回の記事でお会いしましょう。