Laravle#4 簡単な投稿フォームの作成(DBとの連携)
前回は投稿フォームを作成して表示させました。
ただしデータベースとの接続が行われていないので、投稿データを保存することができません。
今回はmigrateとmodelファイルの作成によって送信したデータを投稿フォームに反映してみましょう。
続きを読むLaravel#3 簡単な投稿フォームの作成(フロント側)
前回は初っ端からユーザー情報テーブルの作成と認証機能の実装を行いました。
まだLaravelでページ作成を行っていなかったので今回は投稿フォームのページを表示させてみたいと思います。
http://127.0.0.1:8000/newpostを開くことで以下のようにviewに書いた投稿フォームを表示します。
フォームの送信データとベースとの接続は次の回で行えればと。。。。
続きを読むLaravel#2 ユーザー情報と認証機能の実装(7.x)
「あるユーザーの投稿一覧を表示する」機能を実装したい。
すると後から実装するくらいなら、先に実装した方が応用利くのではないかと思って序盤からいきなり取り組もうと考えた次第です。
そのためにはまずユーザー情報のテーブルが必要、ですので今回はユーザー情報テーブルとついでに認証機能を追加したいと思います。
続きを読む#Django2 リダイレクトページを挟んで投稿時に任意の処理を行う
前回の記事ではDjangoの汎用ビューを使って投稿フォームを簡単に作成できました。
シンプルな機能であれば汎用ビューは他言語・フレームワークにはない便利なものです。
しかしその分融通が利かないデメリットがあるとも感じています。
例えば「投稿と同時にデータベースに任意の処理を加えたい」という場合です。
今回は任意の処理を行うためのリダイレクトページを挟むことによる解決策を書いていきたいと思います。
関数とは
from django.http import HttpResponse def index(request): return HttpResponse("Hello, world!")
上記のようなdefから始まるものは関数と呼ばれるものです。
こちらのサンプルコードの場合、urls.pyで設定した上でexample.com/indexにアクセスすると「Hello World」を返すものとなっております。
投稿と同時処理はできなさそう
defから始まる処理は基本的にページが読み込まれた段階で処理されます。
なので「投稿フォームのメールアドレスを継承→メールアドレスから固有のパラメータを作成→送信したデータと一緒にデータベースに保存」といったことは難しそうです。
ただしリダイレクトページにパラメータを継承することは簡単なので、今回はその方法を試したいと思います。
リダイレクトページの生成
フォーム送信後にリダイレクトページに飛ぶにはViewを以下のように記述します。
from django.urls import reverse_lazy from django.views.generic import CreateView from .models import PostModel class NewReviewClass(CreateView): template_name = 'newreview.html' model = PostModel fields = ('title','url','comment',) def get_success_url(self): return reverse('redirect', kwargs={'pk': self.object.id})
ポイントはget_success_urlの関数です。
''で囲まれているredirectは後程urls.pyで設定する名前で、保存された各データに割り振られるid(プライマリーキー)を'pk'として継承。
urls.pyでは以下のようにリダイレクトページのパスを指定します。
path('redirect/<int:pk>', redirect, name='redirect'),
name=はget_success_urlの値と合うようにredirectにします。
これでexample.com/redirect/PK(プライマリキー)のページが自動的に生成され、遷移します。
リダイレクトページにデータ継承
from django.urls import path from django.conf.urls import url from .views import NewReviewClass from .views import redirect urlpatterns = [ path('newreview/', NewReviewClass.as_view(), name='newreview'), path('redirect/<int:pk>', redirect, name='redirect'), ]
urls.pyについては上記のような感じになると思います
path()の中にある2番目のredirectは実際に生成されたリダイレクトページに対応するviewを指定します。
from django.urls import reverse_lazy from django.views.generic import CreateView from .models import PostModel class NewReviewClass(CreateView): template_name = 'newreview.html' model = PostModel fields = ('title','url','comment',) def get_success_url(self): return reverse('redirect', kwargs={'pk': self.object.id}) def redirect(request, pk): return render(request, 'redirect.html', {'id': id})
これで「フォーム送信→フォームのデータを継承したリダイレクトページに飛ぶ」という流れは出来ているはずです。