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の参考書

コメント
@Nerrynup
2024年2月27日12:50
Hello from Happykiddi.
@Vonaldtok
2024年3月20日3:00
Детский игровой комплекс. Вперед, на площадку!Комплектация: горка детская , счеты пластиковые, мольберт двухсторонний, сетка гладиаторская, горизонтальная и вертикальная лестнички, сортер-вкладыши.
https://www.spainland.ru/modules.php?name=Your_Account&op=new_user
https://gymnastic.pp.ua/beremennaya.html
http://boxing-vrn.ru/obratnaya-svyaz

г.Пушкин, ул.Генерала Хазова, д. 5.Детский спортивный комплекс для дома “KindWood Color Plus 1” оснащён всеми игровыми элементами и спортивными атрибутами, необходимыми для полноценного развития ребёнка. В комплектацию изделия входят следующие спортивные элементы: 1. Шведская стенка. 2. Гладиаторская сетка. 3. Рукоход Ракета 4. Детская горка Волна 5. Кольца Все эти спортивные атрибуты способствуют развитию ловкости и силы малыша, его мелкой моторики, реакции и координации движений. Характеристики: Высота: 150 см Ширина: 85 см Длина: 132 см Перекладины: Бук Гимнастические кольца: Пластик Подробнее.
@Tonaldtok
2024年3月22日0:09
При этом по всему миру есть 65 официальных дистрибьютеров, которые распространяют продукцию на 93 страны.Еси у Вас собственный интернет-магазин, то для получения дилерских цен и условий сотрудничества, Вам необходимо наполнить ваш интернет-магазин нашими товарами.
http://sport-ok.ru/catalog/252/
http://80.ruz.net/res.htm
http://szghbi.ru/category/gandbol

Укладывается синтетическая трава на различные виды оснований песчано-гравийное основание с дренажной системой, бетонная стяжка или асфальт, амортизирующая подложка; организация уклона во всех случаях обязательна .Золотоношский машиностроительный завод им.
@Vonaldtok
2024年4月3日21:49
Дачные спортивные комплексы "Вертикаль" предназначены для установки на улице на травяном газоне. К основанию комплекса присоединены специальные трубы-вставки, которые бетонируется. Это обеспечивает. подробнее.Адаптация проекта Дополнительные аксессуары.
http://www.lord-novgorod.ru/en/winners.php
https://gymnastic.pp.ua/mishtsa.html
http://tihii-omut.com.ua/2015/09/

Стулья растишки для школьников.Комбики для бас-гитар.
@Vonaldtok
2024年4月4日18:10
Детский спортивно-игровой комплекс Чемпион - аналог детского комплекса Непоседа-Чемпион только из дерева, всегда теплый и приятный на ощупь .Многие мальчишки, девчонки мечтают, чтобы возле дома был детский уличный спортивный комплекс. Подобная площадка обеспечит эффективные занятия спортом, увлекательные игры, соревнования и общение со сверстниками. Сегодня дети привыкли сидеть перед телевизором, компьютером, не знают, чем разнообразить свой досуг. Подобные комплексы – уникальная возможность провести время на свежем воздухе интересно, с пользой.
http://www.rfs21.ru/1978-izbran-novyy-prezident-federacii.html
http://velodnepr.dp.ua/site/
http://www.x-bikers.ru/foto/fotogalerea.php?id=42272

Интернет магазин «Крихітка» предлагает к Вашему рассмотрению металлические и деревянные спорткомплексы , которые прекрасно подойдут для развития Вашего малыша. Спорткомплексы помогают деткам с ранних лет развиваться физически, так как энергии у маленького ребенка большое количество. Установив у себя дома подобный спортивный уголок, Вы даете ребенку возможность направлять накопившуюся энергию в нужное русло.Спортуголок для детей– совокупность из нескольких снарядов различного предназначения. Чаще всего в основу комплекса входят шведская стенка и турник. Каждый комплект оснащён необходимыми дополнительными аксессуарами: верёвочными лестницами, турником, доской для пресса и позвоночника, гимнастическими кольцами, боксёрскими грушами. При этом модели могут варьироваться по нескольким критериям.
@Vonaldtok
2024年4月7日5:14
Наше предложение по уличным комплексам.«Много думала: чем занять своего малыша. Он требовал постоянного моего присутствия, внимания и участия в его играх. Когда купила спортивный комплекс домой, в течение дня сыночек подходит к нему много раз и резвится сам.
http://wushu-zentrum.com/108-minut-i-vsya-zhizn/
http://fansfcsevastopol.com/euro12/
http://boyevyye-iskusstva.ru/txekvondo/

Все элементы изготовлены из экологически чистых материалов и соответствуют санитарным правилам и имеют все необходимые сертификаты.высокое качество: в основе конструкций надежный и прочный материал – нержавеющая сталь, устойчивая к большим нагрузкам, влаге, коррозии, агрессивных химических соединений. Сверху турники, брусья, перекладины покрыты порошковой краской, безопасной для ребенка; практичность: изделие сохраняет отличный внешний вид (насыщенный и яркий цвет), качество, целостность в течение длительного периода времени, и при этом не требует особого ухода; прочность: конструкция выдерживает свыше 150 кг; долговечность.
@Vonaldtok
2024年4月8日7:50
Высокое качество, затейливый дизайн, надёжность, прочность, максимальное удобство – основные показатели, характеризующие производство детских площадок компанией «KinderLand». Изучая страницы каталога, Вы оцените разнообразие конструкторских решений предлагаемого уличного оборудования.Уличные тренажеры.
http://simpleflex.ru/istoriya-i-uprazhneniya-ulichnogo-fitnesa/
http://kashlinskaya.ru/sotrudnichedtvo.php
http://nenarokom.ru/kontaktyi.htm

Спортивные комплексы для дачи.-горка из нержавейки с бортами,
コメントする
コメント入力

名前 (※ 必須)

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

送信