Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

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

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

Liverty
Python/Djangoを使ってWebアプリの開発をしています。 Techpitで教材をリリースしました。 「【Django】財務分析アプリを作ってみよう!」 https://www.techpit.jp/p/django-accounting Python/Djangoだけでなく、Chart.js、Datatables(jQuery)、財務会計も学べる一石四鳥の教材です!
https://vancreworth.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした