2021.06.22  

【Django】Formに隠しデータ含めて送信する

今回は入力フォームに記述したデータと一緒にテンプレートで設定した隠しデータをサーバーに送信する方法について解説します。

結論

方法はHTMLの記述の仕方と同じで、テンプレートに<input type="hidden">を使用します。

次の処理をformタグで囲み、submitとすると、hidden_dataというキーに「隠しデータです。」という文字列を紐づけてサーバー(views.py)に送信できます。

 <input type="hidden" name="hidden_data" value="隠しデータです。">



valueにはサーバーから受け取った変数を使用することも可能です。

 <input type="hidden" name="hidden_data" value="{{ receive_data }}">

こうすることで、サーバーから受け取ったデータを次のPOSTに利用することができます。

こちらの具体的な実例は記事の後半で紹介しています。

隠しデータを送信する方法

まず次のようなテンプレートを用意します。

テンプレート
  <form method="POST" name="form">
    {% csrf_token %}
    <b>ULR</b>
    {{ form.url_data}}<br><br>
    <b>キーワード</b>
    {{ form.key_word }}<br><br>

    <!-- 隠しデータを設定しておく部分 -->
    <input type="hidden" name="hidden_data" value="隠しデータです。">

    <input type="submit">
  </form>

<b>実行結果</b>
<p>{{ post_url_data }}</p>
<p>{{ post_key_word }}</p>
<p>{{ post_hidden_data }}</p>

こちらを画面表示すると以下のようになります。

<b>ULR</b>
{{ form.url_data}}<br><br>
<b>キーワード</b>
{{ form.key_word }}<br><br>

この部分で上記画面の入力部分(フォーム)を表示しています。

フォームに入力したはデータについては、URLはurl_dataへ、キーワードはkey_wordへ紐づけられ、送信ボタンを押すとviews.pyに送信されます。

 <!-- 隠しデータを設定しておく部分 -->
<input type="hidden" name="hidden_data" value="隠しデータです。">

今回のお題の部分。

このように記述すると、画面上には何も表示されません。

ですが送信ボタンを押すと、nameのhidden_dataにvalueで定義した「隠しデータです。」というデータが紐づけられ、views.pyに送信されます。

urls.py
from django.urls import path
from . import views

app_name = 'app'

urlpatterns = [
    path('form-test', views.FormTestView),
]

urls.pyは、http://127.0.0.1:8000/form-test にアクセスした際に、views.pyのviews.FormTestViewを実行するように設定しておきます。

views.py
from django.shortcuts import get_object_or_404, redirect, render
from .forms import TestForm

def FormTestView(request):

    # GETメソッドでページを開くときはformの情報だけ送る。
    params = {}
    params['form'] = TestForm

    if request.method == 'POST':
        params['post_url_data'] = request.POST['url_data']
        params['post_key_word'] = request.POST['key_word']
        # input type="hidden" で設定したデータを受け取る。テンプレートで受け取った
        # 「隠しデータです。」という文字列に「ほげほげ」を追記している。
        params['post_hidden_data'] = f"{request.POST['hidden_data']} ほげほげ"

    return render(request, 'app/form_test.html', params)

urls.py が実行されると、上記viwes.pyの FormTestView関数が実行されます。

# GETメソッドでページを開くときはformの情報だけ送る。
params = {}
params['form'] = TestForm

return render(request, 'app/form_test.html', params)

始めにhttp://127.0.0.1:8000/form-test へアクセスすると次の処理が実行され、テンプレートに空のフォーム画面を表示します。

「送信ボタン」が押された場合は、以降の処理が実行されます。

余談ですがここで使用しているTestFormは次のように定義しています。

from django import forms

class TestForm(forms.Form):
    url_data = forms.URLField(max_length=100, required=True,
                              widget=forms.TextInput(
                                   attrs={'placeholder': 'https://rurukblog.com/'}))
    key_word = forms.CharField(max_length=100, required=False,
                               widget=forms.TextInput(
                                     attrs={'placeholder': 'キーワード'}))

次は送信ボタンが押された際に実行される部分です。(views.py)

    if request.method == 'POST':
        params['post_url_data'] = request.POST['url_data']
        params['post_key_word'] = request.POST['key_word']
        # input type="hidden" で設定したデータを受け取る。テンプレートで受け取った
        # 「隠しデータです。」という文字列に「ほげほげ」を追記している。
        params['post_hidden_data'] = f"{request.POST['hidden_data']} ほげほげ"

    return render(request, 'app/form_test.html', params)

request.POST['url_data']は、送信されたURLのデータを 、辞書型のキーpost_url_dataに渡しています。

request.POST['key_word']も同様に、post_key_wordへデータを渡しています。

f"{request.POST['hidden_data']} ほげほげ" は、テンプレートで隠しデータとして渡した「隠しデータです。」という文字列を受け取り、その後ろに「ほげほげ」というデータを付け加えています。

それをキーのpost_hidden_dataに渡しています。

最後にreturn renderで、送信元のテンプレートにデータを返しています。

処理したデータはparamsにまとめられています。

これらの処理を実行したのが次の画面です。

こちらはhttp://127.0.0.1:8000/form-test にアクセスした直後の画面です。

入力フォームに適当な文字列を入力して送信ボタンを押します。

すると入力フォームで記述したデータの他に、隠しデータとしてサーバーに送信したデータもviews.pyで処理した通りの内容で出力されます。

応用編 -- サーバーから受け取ったデータを再利用してPOSTする--

テンプレートのinput type="hidden"の行を以下のように書き換えることで、サーバーから受け取ったデータを次のPOSTに再利用できます。

  <form method="POST" name="form">
    {% csrf_token %}
    <b>ULR</b>
    {{ form.url_data}}<br><br>
    <b>キーワード</b>
    {{ form.key_word }}<br><br>

    <!-- 隠しデータを設定しておく部分 -->
<!--<input type="hidden" name="hidden_data" value="隠しデータです。">-->
    <input type="hidden" name="hidden_data" value="{{ post_key_word }}">

    <input type="submit">
  </form>

<b>実行結果</b>
<p>{{ post_url_data }}</p>
<p>{{ post_key_word }}</p>
<p>{{ post_hidden_data }}</p>

この例では、「隠しデータです。」の部分をviews.pyから受信する変数 {{ post_key_word }} に書き換えています。

入力フォームに適当な文字列を入力して送信ボタンを押します。

初回の送信でpost_key_word変数が空であったため、画面の一番したの部分には「ほげほげ」しか表示されていません。

これはviews.pyで空文字に対して「ほげほげ」を追記し、テンプレートに値を返しているのでこのような結果となります。

しかし、今の状態では前回のキーワードフォームで入力した「aaa」が 変数 post_key_word に格納されているため、再度「送信ボタン」を押すと「aaa」がサーバーに送信されます。

今回はキーワードフォームに「bbb」を入力して送信ボタンを押してみます。

すると、実行結果の2行目には「bbb」が表示され、3行目には「aaa ほげほげ」と表示されており、前回サーバーから受け取った「aaa」を再びサーバーに送信し、文字列「ほげほげ」を追記して画面に返してくれています。

これで検証は終了です。


Djangoの参考書

コメント
現在コメントはありません。
コメントする
コメント入力

名前 (※ 必須)

メールアドレス (※ 必須 画面には表示されません)

送信