新規登録、更新を出来るようにしよう
前回は、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})
更新をしたらトップページに戻る設定にしています。