見出し画像

Cloud9&DjangoでPiazaCloud-todoを再現してみる①


再現時の注意点

MySQLを使わずにSQLiteで再現しています。その為データベースはSQLiteで再現しています。
理由としてmysqlclientの実行部分が無かったからです。

結果は成功します

省略したコマンド部分

$ sudo systemctl enable mysql
$ sudo systemctl start mysql
$ mysql -u rootcreate database mydb;
「アプリケーションでこのデータベースを使うように設定」⇒ mysite/mysite/settings.pyのDATABASES = {}部分

理解のために拡張

modeles.py で 項目を追加

from django.db import models
#
class Post(models.Model):
    body = models.CharField(max_length=200)
    uid = models.IntegerField(default=0) #追加項目

/my_django_project/mysite/todo/models.py

その後でモデルからマイグレーションファイルを作成
python3 manage.py makemigrations todo
次に、作成したマイグレーションファイルを実行
python3 manage.py migrate

ec2-user:~/environment/my_django_project/mysite $ python3 manage.py makemigrations todo[ENTER]
Migrations for 'todo':
todo/migrations/0002_post_uid.py
- Add field uid to post
ec2-user:~/environment/my_django_project/mysite $ python3 manage.py migrate[ENTER]
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, todo
Running migrations:
Applying todo.0002_post_uid... OK
ec2-user:~/environment/my_django_project/mysite $

terminal

併せて修正するファイル

index.htmlファイルで太文字が修正箇所

{% extends 'todo/base.html' %}

{% block content %}
<h1>Todo List</h1>

{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
<form action="{% url 'todo:create' %}" method="post">
{% csrf_token %}
<!-- Todo Name -->
<div class="form-group">
<label for="todo" class="col-sm-3 control-label">Todo↓</label>
<div class="col-sm-6">
{{ form.body }}
{{ form.uid }}
</div>
</div>

<!-- Add Todo Button -->
<div class="form-group">
<div class="col-sm-offset-3 col-sm-6">
<button type="submit" class="btn btn-default">
<i class="fa fa-plus"></i> Add Todo
</button>
</div>
</div>

</form>


<!-- Current Todos -->
<h2>Current Todos</h2>
<table class="table table-striped todo-table">
<thead>
<th>Todos</th><th>&nbsp;</th>
</thead>

<tbody>
{% for post in posts %}
<tr>
<!-- Todo Name -->
<td>
<div>{{ post.body }}</div>
<div>{{ post.uid }}</div>
</td>
<td>
<form action="{% url 'todo:delete' post.id %}" method="post">
{% csrf_token %}
<button>Delete</button>
</form>
</td>
</tr>
{% endfor %}
</tbody>
</table>

{% endblock %}

/my_django_project/mysite/todo/templates/todo/index.html

forms.pyファイルで太文字が修正箇所

from django import forms
#
from .models import Post
#
class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ('body','uid',)

/my_django_project/mysite/todo/forms.py

実行結果

ec2-user:~/environment/my_django_project/mysite $ python3 manage.py runserver 0.0.0.0:8080[ENTER]

ブラウザ

追加考察

urls.pyとviews.pyの関連部分

from django.urls import path
#
from . import views
#
app_name = 'todo' # 注目
#
urlpatterns = [
    path('', views.index, name='index'), # 注目
    path('create', views.create, name='create'),
    path('<int:id>/delete', views.delete, name='delete'),
]

/my_django_project/mysite/todo/urls.py

from django.shortcuts import render, get_object_or_404
from django.http import HttpResponseRedirect, HttpResponse
from django.urls import reverse
from .models import Post
from .forms import PostForm
#
# Create your views here.
def index(request):
    posts = Post.objects.all()
    form = PostForm()
    context = {'posts': posts, 'form': form, }
    return render(request, 'todo/index.html', context)
#
def create(request):
    form = PostForm(request.POST)
    form.save(commit=True)
    return HttpResponseRedirect(reverse('todo:index')) # app_name:name意味
#
def delete(request, id=None):
    post = get_object_or_404(Post, pk=id)
    post.delete()
    return HttpResponseRedirect(reverse('todo:index')) # 下記で説明

/my_django_project/mysite/todo/views.py

reverseを使う利点
メンテナンスが容易:
 URLパターンの名前を使うため、URLが変更された場合でも、コードの他の部分を変更する必要がありません。
これにより、URL構造の変更に対してコードが強固になります。
可読性の向上:
 コードを読んだときに、URLの意味が明確に伝わります。特に、URLに多くのパラメータが含まれている場合に役立ちます。
DRY原則:
 同じURLを複数の場所で使用する場合に、ハードコードされたURLを使わないことでDRY(Don't Repeat Yourself)原則を守ることができます。(by ChatGTP)

ありがとうございます。出典元:
piaza times Django3入門: 初心者でも10分でWebサービスを作れる!PythonフレームワークDjangoとPaizaCloudの使い方


この記事が気に入ったらサポートをしてみませんか?