Web

Python初心者向け:djangoフレームワークの使い方のまとめ

スポンサーリンク


▶ インストールから説明した個別の記事(前半)もあります。

Python初心者向け:Djangoフレームワークの環境構築
Python初心者向けにdjangoフレームワークを用いたWebアプリケーションの作成を基本から解説します。まずは、djanagoフレームワークを使う環境構築をおこないます。そのあと、データベースを作り、Webサーバーの立ち上げまで確認しましょう。
Python初心者向け:django~プロジェクトの作成~
Python初心者向けにWebアプリケーションの作り方を基本から解説します。まずは設定方法を確認してdjangoによる開発環境を構築してしまいましょう。そのあと、プロジェクトの作成をおこない、サーバーをたちあげるところまで確認しましょう。
Python初心者向け:django~アプリケーションの作成~
Python初心者向けにWebアプリケーションの作り方を基本から解説します。今回はプロジェクトの中にアプリケーションをつくります。Webアプリケーションは、データベースと連携して動きます。データベースと連携させる設定を自動でおこなうのがmigrateという処理です。
Python初心者向け:django~管理画面の作成~
Python初心者向けにWebアプリケーションの作り方を基本から解説しています。今回は管理機能つくっていきます。djangoは管理機能をある程度まで自動で作成してくれるので、だれでも簡単にできます。今回は管理機能のちょっとしたカスタマイズまでを扱います。

はじめに

ここまで数回にわたってdjangoによるWebサービスを扱ってきました。今回は数回分をまとめて全体像を確認し、一つ一つを簡単におさらいすることにしましょう。開発途中で起こるエラーとその対処方法についても確認していきましょう。

手順

環境設定

まずは環境設定です。「virtualenv」がインストールされていなければ、まずはこれをインストールしましょう。

pip install virtualenv

次にこの「virtualenv」を使って仮想環境を作っていきます。仮想環境名を決めて、次のコマンドで作成することができます。

virtualenv -p python3 (仮想環境名)

作成した仮想環境をアクティベートするには次のようにします。(Windowsの場合です)

(仮想環境名)\Scripts\activate

これで仮想環境がアクティベートされました。(仮想環境を抜ける場合は「deactivate」とします)次に、この仮想環境に、djangoをインストールしていきましょう。ここではバージョンを指定してインストールすることにします。

pip install django==3.0.5

これで仮想環境をつくることができました。

プロジェクトの作成

プロジェクトはこれからつくるサービス全体の箱のことでしたね。この中に機能(app)を作っていきます。まずは次のコマンドでプロジェクトを作りましょう。

django-admin startproject (プロジェクト名)

すると自動的にプロジェクト名のフォルダが作成され、そのフォルダ内に必要なファイルが生成されます。フォルダ内には、「setting.py」というファイルがあるのでここでdefault言語(’ja’)とタイムゾーン(‘Tokyo/Asia’)を設定しましょう。

この設定ができたら次のコマンドで起動確認します。

python manage.py runserver

アプリケーションの作成

まずはデータベースと連携させる設定をしましょう。これは次のようにします。この一行のコマンドだけで、データベースの設定をしなくても自動で開発用のデータベース(sqlite)が使えるようになります。

python manage.py migrate

次にアプリケーションの作成です。これも一行のコマンドで実行できます。

python manage.py startapp (app名)

すると、プロジェクト名のフォルダの配下にあらたにapp名のフォルダとその配下に必要なファイルが自動生成されます。

まずばモデルの作成をしましょう。モデルは、データベースのテーブルのイメージでしたね。これはapp名フォルダ配下の「models.py」を編集していきます。このファイル内にテーブルの項目をクラスで定義していきます。

(models.py)
from django.db import models
from django.utils import timezone
 
class Post(models.Model):
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(
            default=timezone.now)
    published_date = models.DateTimeField(
            blank=True, null=True)
 
    def __str__(self):
        return self.title

Postクラスの一番最後の 「def __str__」の記述は、管理画面での記事の標示方法です。ここでは、記事タイトルとしています。

モデルを作成したら、プロジェクトの「setting.py」にappを追加する必要があります。「setting.py」内のINSTALLED_APPSの箇所に次のように加えます。

(project配下のsettig.py)
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    '(アプリ名)',
]

さらにデータベースとの接続をする必要があります。これは、「makemigrations」をして、そのあとに「migrate)でしたね。

pythin manage.py makemigrations (アプリ名)
python manage.py migrate (アプリ名)

管理画面の設定

管理画面から設定できるようにするには次のようにする。

(アプリ名/admin.py)
from django.cotrib import admin
from .models import (クラス名)

admin.site.register(アプリ名)

次に管理画面にアクセスするユーザーを作ります。

python manage.py createsuperuser
スポンサーリンク

ユーザー側画面を作る

2つのurls.pyを編集する必要があります。それは、「プロジェクトのurls.py」と「アプリのurls.py」となります。アプリの「urls.py」については、新規作成する必要があります。
ここでは、アプリ名を「blog」としましょう。

(プロジェクトのurls.py)
from django.contrib import admin
from django.urls import path, include # includeを追加
 
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('blog.urls')), # 追加
]
(blog/uruls.py)
from django.urls import path
from . import views
 
urlpatterns = [
    path('', views.post_list, name='post_list'),
]

この状態でサーバー起動するおt、「AttributeError」となる。これあ、blog/urls.py内のpathの「views.py」の中に「post_list」関数が定義されていないから。そこで、「blog/views.py」内に「post_list」関数を定義する。

(blog/views.py)
from django.shortcuts import render
from django.utils import timezone
from .models import Post
 
def post_list(request):
    posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('-published_date') 
    return render(request, 'blog/post_list.html', {'posts': posts}) 

再度、ページにアクセスすると、次は「TemplateDoesNotExist」エラーが発生する。これは、「post_list.html」というテンプレートファイルを作っていないからです。そこで、blog/templates/blog/post_list.htmlを作る。

(post_list.html)
<html>
    <head>
        <title>Django Girls blog</title>
    </head>
    <body>
        <div>
            <h1><a href="/">Django Girls Blog</a></h1>
        </div>
 
        {% for post in posts %}
            <div>
                <p>published: {{ post.published_date }}</p>
                <h1><a href="">{{ post.title }}</a></h1>
                <p>{{ post.text|linebreaksbr }}</p>
            </div>
        {% endfor %}
    </body>
</html>

次に、フォームから登録できるようにする。これは、blog/forms.pyを作る。

(blog/forms.py)
from django import forms
from .models import Post
 
class PostForm(forms.ModelForm):
 
    class Meta:
        model = Post
        fields = ('title', 'text',)

作成したフォームへのリンクを設置します。今回はDjango Girlのチュートリアルを利用しているので、「Django Girls Blog」という見出し部分に記事作成フォームへのリンクを追加します。これは、post_list.htmlを編集します。

(post_list.html)
<div class="page-header">
    <a href="{% url 'post_new' %}" class="top-menu"><span class="glyphicon glyphicon-plus"></span></a> <!-- 追加 -->
    <h1><a href="/">Django Girls Blog</a></h1>
</div>

でも、これだけだとと「NoReverseMatch」というエラーが発生します。これは上記の「post_list.html」の中でname=’post_new’としている部分のURLが定義されていないからです。blog/urls.pyに次のようにパスを追加します。

(blog/urls.py)
urlpatterns = [
    path('', views.post_list, name='post_list'),
    path('post/new/', views.post_new, name='post_new'), # 追加
]

でも、これで再度アクセスしてもまだエラーが起こります。「AttributeError」です。これは「blog/urls.py」のpathに記述した「post_new」関数を「blog/vies.py」に記載していないため起こっています。

(blog/views.py)
from django.shortcuts import render
from django.utils import timezone
from .forms import PostForm # 追加
from .models import Post
 
# post_list関数には変更なし
 
def post_new(request): # 追加
    form = PostForm()
    return render(request, 'blog/post_edit.html', {'form': form})

ここまで来るとゴールが近いですが、まだ「TemplateDoesNotExist」エラーが発生します。これは、「post_edit.html」というテンプレートがないために起こります。そこで次のファイルを作ります。

(templates/blog/post_edit.html)
{% load static %}
<html>
    <head>
        <title>Django Girls blog</title>
        <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
        <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">
        <link href='//fonts.googleapis.com/css?family=Lobster&subset=latin,latin-ext' rel='stylesheet' type='text/css'>
        <link rel="stylesheet" href="{% static 'css/blog.css' %}">
    </head>
    <body>
        <div class="page-header">
            <a href="{% url 'post_new' %}" class="top-menu"><span class="glyphicon glyphicon-plus"></span></a>
            <h1><a href="/">Django Girls Blog</a></h1>
        </div>
 
        <div class="content container">
            <div class="row">
                <!-- 以下の部分だけが post_list.html と異なる -->
                <div class="col-md-8">
                    <h2>New post</h2>
                    <form method="POST" class="post-form">{% csrf_token %}
                        {{ form.as_p }}
                        <button type="submit" class="save btn btn-default">Save</button>
                    </form>
                </div>
            </div>
        </div>
    </body>
</html>

これでエラーはなくなりました。最後にフォームから保存して記事を投稿できるようにします。blog/views.pyを次のように編集します。

(blog/views.py)
from django.shortcuts import redirect # 追加(他のimportは省略)
 
# post_list関数には変更なし
 
def post_new(request):
    if request.method == "POST":
        form = PostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            post.published_date = timezone.now()
            post.save()
            return redirect('post_list')
    else:
        form = PostForm()
    return render(request, 'blog/post_edit.html', {'form': form})
スポンサーリンク

まとめ

一つのエラーに対処してもまた別のエラーが出てきたりします。ただ、エラーは足りないものを教えてくれている、と考えると気が楽ですね。別に怒られているわけではありません。でてきたエラートその原因をまとめて今回は終わりにしましょう。

  • AttributeError
    views.pyに関数が用意されていない
  • TemplateDoesNotExist
    テンプレートが用意されていない
  • NoReverseMatch
    urlpatternsが設定されていない

開発時は次のようなチェックリストを運用するのもよいです。

  • 既存テンプレートに追加する画面へのリンクを追加したか?
  • 追加する画面用のurlpatternsを設定したか
  • (追加する画面で使うモデルを設定したか)
  • 追加する画面用のビュー関数を用意したか
  • 追加する画面用のテンプレートを作成したか

いかがですか?発生するエラーのパターンを知って、その対処方法を知っておくと、少しは気が楽になりますね。よく復習しておきましょう。

Djangoを基礎から体系的に学びたい人には、以下のUdemy講座がおすすめです。この講座は、はじめにPythonの基本文法についても丁寧に導入してくれているのでお勧めです。

プログラミング初心者でも安心、Python/Django入門講座

よかったら参考にしてみてください。

▶ ユーザーページを開設した個別の記事(後半)もあります。

 

コメント

タイトルとURLをコピーしました