SEO対策ならSEO knowledge

TOPプログラムPython>Django

Djangoでsymfonyライクなページャ付きのCRUDを作成するチュートリアル

DjangoでCRUDを作る手順を示します。

  • CRUDとは
    • Create
    • Read
    • Update
    • Delete

1.プロジェクト・アプリケーションの作成

$ django-admin.py startproject test_project
$ cd test_project
$ python manage.py startapp linktracker

を参照してください。

2.モデルとテーブルの作成

  • linktracker/models.pyにLinkモデルを追加。ついでにadminから見れるようにregisterしておく。
from django.db import models

# Create your models here.
class Link (models.Model):
    link_description = models.CharField(max_length=200)
    link_url = models.CharField(max_length=200)
  • DBにLinkテーブルを作成
$ python manage.py syncdb

Creating table linktracker_link

3.アプリケーションの読み込みとURLの設定

  • settings.pyに1行追加
INSTALLED_APPS = (
     'test_project.linktracker', # 追加
)

*urls.pyに8行追加
{{{
urlpatterns = patterns('',
...
    (r'^links/$', 'test_project.linktracker.views.list') , # 追加(トップページ)
    (r'^links/list$', 'test_project.linktracker.views.list') , # 追加(一覧ページ)
    (r'^links/list/(?P<page>\d+)', 'test_project.linktracker.views.list') , # 追加(一覧ページャ)
    (r'^links/show/(?P<id>\d+)', 'test_project.linktracker.views.show'), # 追加(パーマリンク)
    (r'^links/add', 'test_project.linktracker.views.add'), # 追加(新規作成)
    (r'^links/edit/(?P<id>\d+)', 'test_project.linktracker.views.edit'), # 追加(編集ページ)
    (r'^links/delete/(?P<id>\d+)', 'test_project.linktracker.views.delete'), # 追加(削除アクション)
    (r'^links/update/', 'test_project.linktracker.views.update'), # 追加(POSTアクション)
)

4.ビューの作成

  • linktracker/views.py
from django.core.paginator import Paginator
from test_project.linktracker.models import Link
from django.shortcuts import render_to_response, get_object_or_404
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse

def list(request, page = 1):
    page = int(page)
    link_list = Paginator(Link.objects.all(), 5)
    p = link_list.page(page)
    return render_to_response('linktracker/list.html',{
        'link_list': p.object_list,

        'has_first': 2 < page,
        'first_page': 1,

        'has_last': page + 1 < link_list._get_num_pages(),
        'last_page': link_list._get_num_pages(),

        'has_previous': p.has_previous(),
        'previous_page': page - 1,

        'has_next': p.has_next(),
        'next_page': page + 1,

    })

def show(request, id):
    link = get_object_or_404(Link, pk=id)
    return render_to_response(
        'linktracker/show.html',{
            'link': link,
        }
    )

def add(request):
    return render_to_response(
        'linktracker/edit.html'
    )

def edit(request, id):
    link = get_object_or_404(Link, pk=id)
    return render_to_response(
        'linktracker/edit.html'
    )

def update(request):
    id = request.POST["id"]
    if id:
        link = get_object_or_404(Link, pk=id)
    else:
        link = Link()
        
    link.link_description = request.POST["link_description"]
    link.link_url = request.POST["link_url"]
    link.save()
    return HttpResponseRedirect('/links/show/'+str(link.id))

def delete(request, id):
    Link.objects.get(id=id).delete()
    return HttpResponseRedirect('/links/list')

5.テンプレートの作成

  • linktracker/list.htmlを作成
<h1>Links</h1>
 <a href='/links/add'>Create</a>
<table>
    <tr>
        <th>
            Id:
        </th>
        <th>
            Description:
        </th>
        <th>
            Url:
        </th>
    </tr>
    {% for link in link_list %}
        <tr>
            <td>
                <a href="/links/show/{{ link.id }}">{{ link.id }}</a>
            </td>
            <td>
                {{ link.link_description }}
            </td>
            <td>
                <a href="{{ link.link_url }}">{{ link.link_url }}</a>
            </td>
        </tr>
    {% endfor %}
</table>

 
{% if has_first %}
<a href='/links/list/{{ first_page }}'>&lt;&lt;</a>
{% endif %}

{% if has_previous %}
<a href='/links/list/{{ previous_page }}'>&lt;prev</a>
{% endif %}
|
{% if has_next %}
<a href='/links/list/{{ next_page }}'>next&gt;</a>
{% endif %}

{% if has_last %}
<a href='/links/list/{{ last_page }}'>&gt;&gt;</a>
{% endif %}
  • linktracker/show.htmlを作成
<h1>Link Show</h1>
<table>
    <tr>
        <th>
            Id:
        </th>
        <td>
            {{ link.id }}
        </td>
    </tr>
    <tr>
        <th>
            Description:
        </th>
        <td>
            {{ link.link_description }}
        </td>
    </tr>
    <tr>
        <th>
            Url:
        </th>
        <td>
            <a href="{{ link.link_url }}">{{ link.link_url }}</a>
        </td>
    </tr>
</table>
&nbsp;<a href='/links/edit/{{ link.id }}'>edit</a>
&nbsp;<a href='/links/delete/{{ link.id }}'>delete</a>
&nbsp;<a href='/links/'>list</a>
  • linktracker/edit.htmlを作成
<h1>Link Edit</h1>

<form action='/links/update/' method='post'>
    <input type="hidden" name="id" value="{{ link.id }}">
    <table>
        <tr>
            <th>
                Description:
            </th>
            <td>
                <input name=link_description value="{{ link.link_description|escape}}">
            </td>
        </tr>
        <tr>
            <th>
                Url:
            </th>
            <td>
                <input name=link_url value="{{ link.link_url|escape }}">
            </td>
        </tr>
    </table>
    <input type=submit value="Save">
    <a href="/links/show/{{ link.id }}">Cancel</a>
</form>

6.表示確認

関連リンク

 このエントリをはてなブックマークに登録 このエントリをlivedoorクリップに登録 Yahoo!ブックマークに登録 このエントリを del.icio.us に登録 Google Bookmarks に追加
[ 新規 | 編集 | 削除 | 凍結 ]    [ 新着 | 履歴 | ヘルプ ]

この記事に関連する求人

携帯サイト

携帯サイトはこちら

QRコード

http://it.kndb.jp/m

ページ上部へ