LoginSignup
4
3

More than 5 years have passed since last update.

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

Posted at

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

前回は、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})

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

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3