①初期設定
前提
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>