index create(CRUD) - Django

フォルダ構成

  • pythonApp
    • crud
      • crud
        • crud
          • __pycache__
          • __init__.py
          • asgi.py
          • settings.py
          • urls.py
          • wsgi.py
        • member
          • migrations
            • ...
          • templates
            • member
              • create.html
              • index.html
          • __init__.py
          • admin.py
          • apps.py
          • forms.py
          • models.py
          • tests.py
          • urls.py
          • views.py
        • db.sqlite3
        • manage.py
      • include
      • Lib
      • Scripts
      • pyenv.cfg

urls

pythonApp\crud\crud\crud\urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('member/', include('member.urls'))
]

pythonApp\crud\crud\member\urls.py

from django.urls import path
from . import views

urlpatterns = [
  path('', views.index, name='index'),
  path('create', views.create, name='create'),
]

forms

pythonApp\crud\crud\member\forms.py

from django import forms

class UserForm(forms.Form):
  name = forms.CharField(label='name')
  mail = forms.CharField(label='mail')
  gender = forms.BooleanField(label='Gender', required=False)
  age = forms.IntegerField(label='age')
  birthday = forms.DateField(label='Birth')

templates

pythonApp\crud\crud\member\templates\member\create.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>member/create</title>
</head>
<body>
  <h1>member/create</h1>
  <table>
    <form action="{% url 'create' %}" method="post">
      {% csrf_token %}
      {{ form.as_table }}
      <tr>
        <td></td>
        <td><input type="submit" value="click"></td>
      </tr>
    </form>
  </table>
</body>
</html>

pythonApp\crud\crud\member\templates\member\index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <h1>member/index</h1>
  <table>
    <tr>
      <td>data</td>
    </tr>
    {% for item in data %}
    <tr>
      <td>{{item}}</td>
    </tr>
    {% endfor %}
  </table>
</body>
</html>

ModelForm を使う

モデルのためのフォームを作成する「 ModelForm 」クラスを使うには、以下のように変更します。

pythonApp\crud\crud\member\forms.py

from django import forms
from .models import User

class UserForm(forms.ModelForm):
  class Meta:
    model = User
    fields = ['name', 'mail', 'gender', 'age', 'birthday']

pythonApp\crud\crud\member\views.py

from django.shortcuts import render
from django.http import HttpResponse
from django.shortcuts import redirect
from .models import User
from .forms import UserForm

# Create your views here.
def index(request):
  data = User.objects.all()
  params = {
    'title': 'Hello',
    'data': data,
  }
  return render(request, 'member/index.html', params)

def create(request):
  if(request.method == 'POST'):
    obj = User()
    user = UserForm(request.POST, instance=obj)
    user.save()
    return redirect(to='/member')
  
  params = {
    'title': 'Hello',
    'form': UserForm(),
  }
  return render(request, 'member/create.html', params)