LoginSignup
0
0

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

Posted at

はじめに

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

前提条件

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

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

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

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を作成

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を編集する

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を編集

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

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 %}

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

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 %}

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

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

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に反映させます。

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0