質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.36%

  • JavaScript

    11233questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • Python

    3843questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Django

    554questions

    DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

JSで取り出したデータをFormに入れたい

解決済

回答 2

投稿 2017/12/07 10:32 ・編集 2017/12/07 11:52

  • 評価
  • クリップ 0
  • VIEW 98

0101

score 122

JSのデータをFormに入れたいです。
index.htmlには

 {% load staticfiles %}
        <html lang="ja">
          <head>
            <meta charset="utf-8">
            <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
            <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
            <script src="https://code.jquery.com/jquery-1.11.0.min.js"></script>
          </head>
          <body>

          <main>

            <form class="form-horizontal" action="/accounts/regist_save/" method="POST">
            

        
            

                <label for="id_email">Email</label>{{ regist_form.email }}    
                



              {% include 'registration/sex.html' %}


                <button type="submit" class="regist">REGIST</button><input name="next" type="hidden"/>{% csrf_token %}</form></main>

          </body>
        </html>


と書き、forms.pyには

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.forms import AuthenticationForm
from .models import User
from .models import NewUser

class RegisterForm(UserCreationForm):
    class Meta:
        model = User
        fields = ('email',)
    def __init__(self, *args, **kwargs):
        super(RegisterForm, self).__init__(*args, **kwargs)
        self.fields['email'].widget.attrs['class'] = 'form-control'

class ProfileForm(forms.ModelForm):
    class Meta:
        model = NewUser
        fields = (
             "sex"
        )


と書き、
models.pyには

#coding:utf-8
from django.db import models
from django.contrib.auth.models import User

class NewUser(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    sex = models.CharField(max_length=100,null=True, blank=True, default=None)


と書き、
sex.htmlには

<form class="form-horizontal" method="post" action="#">
        <div class="form-group-lg">
        <label for="sex">SEX</label><select class="form-control sex" name="sex">
        <option value="">--</option>
        <option value="male">MAN</option>
        <option value="female">FEMALE</option>
        </select>
        </div>
        

    </form>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
    <script>
        function showSex() {
            var num = document.forms[0].sex.selectedIndex;
            var sex = document.forms[0].sex.options[num].value;
            console.log(sex);
        }

        document.addEventListener("DOMContentLoaded", showSex);
        for (var i = 0, e = document.querySelectorAll(".form-horizontal select"); i < e.length; i++) {
            e[i].addEventListener("change", showSex);
        }
    </script>


と書きました。
今index.htmlのREGISTボタンが押せません。sex.htmlで選択したvalue(maleもしくはfemale)が

 var sex 


で取得できますが、それをmodels.pyの

sex = models.CharField(max_length=100,null=True, blank=True, default=None)


に入れたいです。今JSを使ってvalueの値を取得するところまではできていますが、その値をPythonのProfileFormを経由してモデルのsexカラムに入れる方法がわかりません。そもそもそれは可能なのでしょうか?どのように書けば、何を使えばそれが実現できますか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Lhankor_Mhy

    2017/12/07 15:35

    Required になっていないような気もしますが…… では、必須項目を入力すればボタンを押せるのですね?

    キャンセル

  • 0101

    2017/12/07 16:15

    はい、そのようであるはずです

    キャンセル

  • Lhankor_Mhy

    2017/12/07 17:50

    試していないのですか? なぜ試さないのでしょう? 試していないのになぜフォームの値がモデルに入らないとわかったのでしょうか?

    キャンセル

回答 2

checkベストアンサー

0

テンプレートファイルを見る限り、このようなHTMLになるはずです。

<form class="form-horizontal" action="/accounts/regist_save/" method="POST"><!-- ... -->

  <form class="form-horizontal" method="post" action="#">
    <div class="form-group-lg">
      <label for="sex">SEX</label><select class="form-control sex" name="sex">
        <option value="">--</option>
        <option value="male">MAN</option>
        <option value="female">FEMALE</option>
      </select>
    </div>
        

  </form>

  <button type="submit" class="regist">REGIST</button><!-- ... -->

</form>


form要素が入れ子になっています。
これは許されていませんから、ブラウザはこのように解釈します。

<form class="form-horizontal" action="/accounts/regist_save/" method="POST">
</form>

<!-- ... -->

<form class="form-horizontal" method="post" action="#">
  <div class="form-group-lg">
    <label for="sex">SEX</label><select class="form-control sex" name="sex">
      <option value="">--</option>
      <option value="male">MAN</option>
      <option value="female">FEMALE</option>
    </select>
  </div>
        

</form>

<button type="submit" class="regist">REGIST</button><!-- ... -->


submitボタンがフォームの外に出ていますので、フォームの内容は送信されません。
 
 
 
あと、view.pyが提示されていないので詳細はわかりませんが、問題はこれだけじゃないと思いますよ。

投稿 2017/12/07 19:49

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

JSで持っているデータを直接pythonで処理させたいということでしょうか?

一度POSTするなりしないとサーバー側にデータがいかないと思うのですが、何か違う挙動を想定されていますか?

投稿 2017/12/07 11:32

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/07 11:55

    はい、 var sex = document.forms[0].sex.options[num].value; で取れたsexをモデルに登録したいです。その場合も、POSTする必要がありますか?

    キャンセル

  • 2017/12/07 12:14

    ブラウザの情報を何かしらの方法でサーバーに伝えないと モデルに入れられないと思うのですが。
    サーバーはDjangoですよね??

    フォームに入れたいだけならJSでできると思います

    キャンセル

  • 2017/12/07 15:27

    フォームに入れたいだけではなく、モデルに入れたいです。どうしたらJSの内容をサーバーに伝えられますか?サーバーはDjangoです

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.36%

関連した質問

同じタグがついた質問を見る

  • JavaScript

    11233questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • Python

    3843questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Django

    554questions

    DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。