気ままなタンス*プログラミングなどのノートブック

プログラミングやRPGツクール、DTM、VOCALOIDについてのんびり書きます。

【Django】Formの使い方について復習(2016/06/11)

数か月ぶりにDjango(バージョンは1.9)を書いていたけど、色々と忘れてしまっていた。 復習のためメモしておく。

Formの定義

from django import forms

class AnyForm(forms.ModelForm):
    
    class Meta:
        model = AnyModel
        fields = ('any_id', 'any_name')

Formの利用

  • モデルのPK(any_id)がビューに渡された場合は、既存データの更新処理として動く
  • それ以外は新規作成を行う
#-----------------------------------------------------
# views.py
#-----------------------------------------------------
from django.shortcuts import get_object_or_404, render
from django.core.urlresolvers import reverse_lazy

from .forms import AnyForm
def do_any_action(request, any_id):
    # 更新・登録
    if request.method == "POST":
        any_form = AnyForm(request.POST)
        if any_form.is_valid():
            if any_id:
                any_obj = get_object_or_404(AnyModel, pk=any_id)
                any_obj.any_name = any_form.cleaned_data["any_name"]

            else:
                # ModelFormはモデルインスタンスを返す(commit=Falseの場合、DBには保存しない)
                any_obj = any_form.save(commit=False)


            # any_objに作成・更新で共通の処理
            
            
            # 保存
            any_obj.save()
            return redirect(reverse_lazy('pj:result'))
        else:
            return render(request, 'pj/any.html', dict(any_id=any_id, form=any_form)

    # 更新・登録画面への遷移        
    else: 
        any_form = AnyForm()
        return render(request, 'pj/any.html', dict(any_id=any_id, form=any_form))


#-----------------------------------------------------
# urls.py
#-----------------------------------------------------
from django.conf.urls import url
from django.views.generic import TemplateView
from . import views

name = "pj"
urlpatterns = [
   url(r'^mod_any_action/(P<any_id>\d+)/$', views.do_any_action, name="mod_any_action"),
   url(r'^cre_any_action/$', views.do_any_action, name="cre_any_action"),
   url(r'^result$', TemplateView.as_view(template_name="result.html")),
]           

テンプレート

<!-- any.html -->

<!doctype html>
<html>
<head>
  <title>any</title>
</head>
<body>
  {% if any_id %}
  <form action="{% url 'pj:mod_any_action' any_id %}" method="post">
  {% else %}
  <form action="{% url 'pj:cre_any_action' %} method="post">
  {% endif %}
    {{ form.any_name }}
    {% csrf_token%}
  </form>
</body>
</html>

雑感

あまりに久々すぎて、しょぼいミスが目立ってしまった。 ModelFormではない普通のFormを定義していて、そのフィールドにカンマをつけるというミスをしていることに気づかずに 「意図した動作をしない」と悩んでしまった。

定期的にコードを書く機会を作るべきだと感じた。