Python3.5.1 + Django2.0.3 で、簡単なCRUDアプリを作る(2)

新規登録、更新を出来るようにしよう

前回は、setting.py, views.py, urls.py(2つありますね), models.py, などの基本的な設定をして、一覧画面を表示するところまで行いました。
https://qiita.com/Liverty/items/f0d076e142c6a716ffcd

今回はその続きをやっていきます。

新規登録画面へのリンクを貼る

まず、index.htmlのテーブル開始タグのすぐ上に、下記のようなリンクを記述しましょう。

templates/crud/index.html
<a href="/add">登録画面へ</a>

記載したら、正しく画面遷移することを確認してください。

Djangoフォームを作る

続いて、models.pyと同じフォルダに、forms.pyを作り、下記のように記述します。

forms.py
from django import forms
from .models import Department

class DepartmentForm(forms.ModelForm):
    class Meta:
        model = Department
        fields = ('name', 'name_short', 'created_date',)
        widgets = {'name': forms.TextInput(),
                    'name_short': forms.TextInput(),
                    'created_date': forms.DateTimeInput(),
                    }

このフォームの書き方は、バージョンの違いが結構あります。

フォームの内容を出力するために、viwes.pyを編集します。

views.py
from django.shortcuts import render, redirect
from django.http import HttpResponse
from .models import Department
from .forms import DepartmentForm

def index(request):
    contexts = {
        'departments': Department.objects.all(),
    }
    return render(request, 'crud/index.html', contexts)

def add(request):
    form = DepartmentForm(request.POST or None)
    if form.is_valid():
        Department.objects.create(**form.cleaned_data)
        return redirect('/')
    form = DepartmentForm()
    return render(request, 'crud/edit.html', {'form': form})

新規追加画面で登録後に、一覧画面で確認してみてください。
データが追加されていればOKですね。

一覧画面から更新画面へのリンクを作る

一覧画面で、部門名をクリックしたら更新画面に遷移するようにしましょう。

index.html
{% extends 'crud/base.html' %}
{% block body %}
<a href="/add">登録画面へ</a>
    <table border="1">
      <thead>
        <tr>
          <th>部門名</th>
          <th>略称</th>
          <th>登録日</th>
        </tr>
      </thead>
      <tbody>
        {% for department in departments %}
          <tr>
            <td><a href="/edit/{{ department.id }}/">{{ department.name }}</a></td>
            <td>{{ department.name_short }}</td>
            <td>{{ department.created_at }}</td>
          </tr>
        {% endfor %}
      </tbody>
    </table>
{% endblock %}

この書き方がベストかどうかわかりませんが、とりあえず動きます。

更新処理を書く

まずcrud/urls.pyの先頭を更新します。

crud/urls.py
from django.shortcuts import render, redirect, get_object_or_404

get_object_or_404 を追加するだけです。
続いて、edit処理を書きます。

views.py
def edit(request, pk):
    department = get_object_or_404(Department, pk=pk)
    if request.method == 'POST':
        form = DepartmentForm(request.POST)
        if form.is_valid():
            department.name = form.cleaned_data['name']
            department.name_short = form.cleaned_data['name_short']
            department.save()
            return redirect('/', pk=department.pk) #更新をしたらトップページへ

    else:
        form = DepartmentForm(instance=department)
    return render(request, 'crud/edit.html', {'form': form})

更新をしたらトップページに戻る設定にしています。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.