①初期設定

Python

前提

Windows

Pythonのインストール

公式サイトからWindows installer(64bit)をダウンロードしてバージョン確認する
python --version

Pythonのバージョンアップ

公式のPythonウェブサイトで最新バージョンをDLし、インストーラーを実行します

「Add python.exe to PATH」にチェックを入れておきます

ライブラリが引き継がれないので、ダウンロードが必要です

※バージョンアップとアップグレートの違い

アップグレードとは、3.10.2->3.10.8 のような更新です。ライブラリは引き継がれます。

バージョンアップは3.10.2->3.13.9のような更新です。ライブラリが引き継がれないためDLが必要です。バージョンアップするとPC内には「Python3.10」と「Python3.13」の2つが存在します。

Djangoのインストール

プロジェクトとアプリの作成

django-admin startproject [任意のプロジェクト名]
cd [任意のプロジェクト名]
python manage.py startapp [任意のアプリ名]

基本的なディレクトリを作成する

mkdir templates や type nul > sample.py 等を使って次のようなディレクトリ階層をつくっていきます

[任意のプロジェクト名]
--- media --- photo --- sample.webp
--- static --- css --- style.css
--- [任意のプロジェクト名] --- urls.py
                         --- settings.py
--- [任意のアプリ名] --- admin.py
                    --- urls.py
                    --- forms.py
                    --- views.py
                    --- models.py
                    --- migrations
                    --- templates --- [任意のアプリ名] --- base.html
                                                      --- index.html
                                                      --- edit.html
                                                      --- detail.html
                                                      --- delete.html
                                                      --- new.html

ライブラリのインポート

cd [任意のプロジェクト名]
pip install django
pip install django-cleanup
pip install Pillow

pip list  // Djangoがインストールされているか確認します

Migrate

python manage.py makemigrations  // migrationsディレクトリを作成します ※1
python manage.py migrate  // migrationsディレクトリの内容を元にmigrateします
python manage.py createsuperuser  // migrateして作成されたテーブルにユーザー登録します
ユーザー名:@8c.....
メールアドレス:なし
Password: 58........
Superuser created successfully.
python manage.py runserver  // ローカルサーバーを立ち上げます

※1 … 「ModuleNotFoundError: No module named ‘django_cleanupdjango’」というエラー

⇒settings.pyのINSTALLED_APPSで’django_cleanup’ のあとに「,」を忘れてました

管理画面を開く

[http://127.0.0.1:8000/admin/]にアクセスしてユーザー名とパスワードを入力してログインします

[任意のプロジェクト名]/[任意のプロジェクト名]/settings.py

import os
INSTALLED_APPS = {
    '[任意のアプリ名]',
    'django_cleanup',
}
LANGUAGE = 'ja'
TIMEZONE = 'Asia/Tokyo'

STATIC_URL = 'static/'
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

[任意のプロジェクト名]/[任意のプロジェクト名]/urls.py

from django.urls import path, include
from django.contrib import admin  // contribはcontribute(提供する)の略でDjangoが提供している機能
from django.conf import settings  // confはconfiguration(設定)の略
from django.conf.urls.static import static

urlpatterns = [
    path('admin', admin.site.urls),
    path('', include('[任意のアプリ名].urls')),
]
urlpatterns += static(
    settings.MEDIA_URL,
    document_root=settings.MEDIA_ROOT
)

urls.py

from django.urls import path
from django.contrib.auth import views as auth_views
from . import views

app_name = '[任意のアプリ名]'
urlpatterns = [
    path('', views.index, name='index'),
    path('new', views.new, name='new'),
    path('detail/<int:id>', views.detail, name='detail'),
    path('delete/<int:id>', views.delete, name='delete'),
    path('edit/<int:id>', views.edit, name='edit'),
]

forms.py

from django.forms import ModelForm
from .models import App

class AppForm(ModelForm):
    class Meta:
        model = App
        fields = ['title', 'text', 'image']

models.py

from django.db import models

class App(models.Model):
    title = models.CharField(max_length=50)
    text = models.TextField(blank=False)
    created_datetime = models.DateTimeField(auto_now_add=True)
    image = models.ImageField(upload_to='photo')

admin.py

from django.contrib imort admin
from .models import App

class AppAdmin(admin.ModelAdmin):
    list_display = ('id', 'title')
    list_display_link = ('id', 'title')  // リンクをつける項目を選択します

admin.site.register(App, AppAdmin)

views.py

from django.shortcuts import render, redirect, get_object_or_404
from django.views.decorators.http import require_POST
from .forms import AppForm
from .models import App

def index(request):
    apps = App.objects.order_by('-created_datetime')
    return render(request, 'app/index.html', {'apps':apps})

def new(request):
    if request.method == 'POST':
        form = AppForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect('app:index')
    else:
        form = AppForm()
    return render(request, 'app/new.html', {'form':form})

detail detail(request, id):
    app = get_object_or_404(App, id=id)
    return render(request, 'app/detail.html', {'app': app})

@require_POST   // methodがPOSTの時だけdelete関数を実行します
def delete(request, id):
    app = get_object_or_404(App, id=id)
    app.delete()
    return redirect('app:index')

def edit(request, id):
    app = get_object_or_404(App, id=id)
    if request.method == 'POST':
        form = AppForm(request.POST, request.FILES, instance=app)
        if form.is_valid():
            form.save()
            return redirect('app:detail', id=app.id)
    else:
        form = AppForm(instance=app)
    return render(request, 'app/edit.html'), {'app':app, 'form':form})

sample.com/newにアクセスするとurls.pyの指示でviews.pyのnew(request)が実行されます

render()は実行結果をHTMLのテンプレートファイルnew.htmlにレンダリング(描画)します

base.html

{% load static %}
<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <link rel="stylesheet" href="{% static 'css/style.css' %}">
    </head>
    <body>
        <header>
            <a href="{% url 'app:index' %}">HOME</a>
            <a href="{% url 'app:new' %}">NEW</a>
        </header>
        <main>
            {% block content %}{% endblock %}
        </main>
    </body>
</html>

index.html

{% extends "app/base.html" %}

{% block content %}
    {% for app in apps %}
    <a href="{% url 'app:detail' app.id %}">
        <img src="{{ app.image.url }}" />
        {{ app.title }}
        {{ app.created_datetime | date:'Y/m/d' }}
        {{ app.text }}
    </a>
    {% endfor %}
{% endblock %}

new.html

<form method="POST" action="{% url 'app:new' %}" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.non_field_errors }}
    <div>
        {{ form.title.label_tag }}
        {{ form.title }}
        {{ form.title.errors }}
    </div>
    <div>
        {{ form.text.label_tag }}
        {{ form.text }}
        {{ form.text.errors }}
    </div>
    <div>
        {{ form.image.label_tag }}
        {{ form.image }}
        {{ form.image.errors }}
    </div>
    <button type="submit">SAVE</butto>
</form>

detail.html

{{ app.title }}
{{ app.text }}
<form method="POST" action="{% url 'app:delete' app.id %}">
    {% csrf_token %}
    <button type="submit" onclick="return confirm(REALLY?)">DELETE</button>
</form>

edit.html

<form method="POST" action="{% url 'app:edit' app.id %}">
    {% csrf_token %}
    {{ form.non_field_errors }}
    <div>
        {{ form.title.label_tag }}
        {{ form.title }}
        {{ form.title.errors }}
    </div>
    <div>
        {{ form.text.label_tag }}
        {{ form.text }}
        {{ form.text.errors }}
    </div>
    <div>
        {{ form.image.label_tag }}
        {{ form.image }}
        {{ form.image.errors }}
    </div>
    <button type="submit">UPDATE</button>
</form>
BACK