LoginSignup
10
12

More than 5 years have passed since last update.

Django views.pyとurls.py のベストプラクティス(?)

Last updated at Posted at 2016-10-24

Djangoで簡単なアプリケーションを作る前に

views.py やurls.py の設定周りを物凄く簡単に学ぶにはどうすればいいのか。数々の失敗を繰り返す前に基本だけ抑えていくと、あとがスムーズなんじゃないかと考えてみました。

Djangoの導入は過去記事 http://qiita.com/Gen6/items/1848f8b4d938807d082e

今回のうったてとしてテンプレートの段取りが終わっているものとします。
http://qiita.com/Gen6/items/a5562c36fc5c67c89916

過去記事参照で同じようにしておくと話がわかりやすいかと思います。

時間を表示させてみる

templates/index.html
{% extends "base.html" %}
{% block body %}

    <p>{{hour}} 時です</p>

{% endblock %}
myapp/urls.py
from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^template/$', views.index, name='index'),
]
myapp/views.py
from datetime import datetime
from django.http.response import HttpResponse
from django.shortcuts import render


def index(request):
    Datetime = {
        'hour': datetime.now().hour,
    }
    return render(request, 'index.html', Datetime)

上記を http://127.0.0.1:8000/myapp/ で確認すると時間が表示されるはずです。
タイムゾーンが狂ってる場合は settings.py で 'UTC' から 'Asia/Tokyo' へ変更してください。

名前を入力したら内容を返すフォームを作ってみる

templates/index.html

{% extends "base.html" %}
{% block body %}

    <form action="" method="get">
      <label>名前:<input type="text" size="20" name="your_name"></label>
      <input type="submit" value="送信">
    </form>
    {% if your_name %}
      <p>{{ your_name }}さん、こんにちは。</p>
    {% endif %}

{% endblock %}
myapp/urls.py
from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.get_query, name='get_query'),
    url(r'^template/$', views.index, name='index'),
]
myapp/views.py
from django.http.response import HttpResponse
from django.shortcuts import render


def get_query(request):
    Message = {
        'your_name': request.GET.get('your_name'),
    }
    return render(request, 'index.html', Message)

上記を http://127.0.0.1:8000/myapp/ で確認するとフォームが出て、
フォームに入力した文字列を返します。

2つの挙動を混在させるにはどうするか

さて、ここからが本題です。
時間を表示させつつ、フォームも生かすにはどうすればよいのでしょうか。

動かない一例

templates/index.html
{% extends "base.html" %}
{% block body %}

    <p>{{hour}} 時です</p>
    <form action="" method="get">
      <label>名前:<input type="text" size="20" name="your_name"></label>
      <input type="submit" value="送信">
    </form>
    {% if your_name %}
      <p>{{ your_name }}さん、こんにちは。</p>
    {% endif %}

{% endblock %}
myapp/urls.py
from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^$', views.get_query, name='get_query'),
    url(r'^template/$', views.index, name='index'),
]
myapp/views.py
from datetime import datetime
from django.http.response import HttpResponse
from django.shortcuts import render


def index(request):
    Datetime = {
        'hour': datetime.now().hour,
    }
    return render(request, 'index.html', Datetime)

def get_query(request):
    Message = {
        'your_name': request.GET.get('your_name'),
    }
    return render(request, 'index.html', Message)

これでは動きません。
問題点はどこにあるでしょうか。

動く例

myapp/urls.py
from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^template/$', views.index, name='index'),
]
myapp/views.py
from datetime import datetime
from django.http.response import HttpResponse
from django.shortcuts import render


def index(request):
    Message = {
        'your_name': request.GET.get('your_name'),
        'hour': datetime.now().hour
    }
    return render(request, 'index.html', Message)

なんとなーく、掴めてきたら色々と設定を試してみるとより理解が深まるのでは、と思います。

実際のアプリケーション作成は別記事にて。
http://qiita.com/Gen6/items/735245423b65698428be

10
12
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
10
12