Djangoのフォームの良いところ
- フォームを0から定義可能
- フォームの結果をモデルに保存できる
ModelForm
を作ることが可能
forms.pyの配置
blog
└── forms.py
モデルのためのフォームを作成
appName/forms.py
from django import forms
from .models import DB★#models.pyで定義したDBを使用
class PostForm(forms.ModelForm):
class Meta:★#どのモデルを使えばよいかを伝える
model = DB
fields = ('yourField',)★#()内部は','で終わる必要がある
フォームのための新しいviewを作成
appName/templates/appname/base.html
<html>
<head>
<title>Django Girls blog</title>
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">
<link href='//fonts.googleapis.com/css?family=Lobster&subset=latin,latin-ext' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="{% static 'css/blog.css' %}">
</head>
<body>
<div class="page-header">
<a href="{% url 'post_new' %}" class="top-menu"><span class="glyphicon glyphicon-plus"></span></a>★urlにpost_newを追加
<h1><a href="/">Django Girls Blog</a></h1>
</div>
<div class="content container">
<div class="row">
<div class="col-md-8">
{% block content %}
{% endblock %}
</div>
</div>
</div>
</body>
</html>
post_newビューをviews.pyに記述
POST
フォームを新規作成するには
-
PostForm()
を呼び出す - テンプレート渡す
ビューで扱う二つのシチュエーション
- 最初のページアクセスで空白のフォームが必要な場合
-
form
タグからPOST
されて、リクエストが送信されたとき
appName/views.py
from .forms import PostForm
(中略)
def post_new(request):
form = PostForm()
return render(request, 'blog/post_edit.html', {'form': form})
1,2のシチュエーションに応じて場合分けを行ったviews.pyファイルの内容
appName/views.py
import django.shortcuts import render, redirect
if request.method == "POST":
form = PostForm(request.POST)
if form.is_valid():
post = form.save(commit=False)
#以降は実装によりけり
# post.author = request.user
# post.published_date = timezone.now()
post.save()#★DBにセーブする
# return redirect('post_detail', pk=post.pk)
else:
form = PostForm()
return render(request, 'blog/post_edit.html', {'form': form})