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

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

新規登録して質問してみよう
ただいま回答率
87.20%
Django

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

解決済

djangoのformsetでtemplateにform.fieldと書いた場合の保存方法

keraker
keraker

総合スコア41

Django

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

2回答

0評価

0クリップ

2421閲覧

投稿2020/08/10 03:01

編集2020/08/11 02:53

追加
返信ありがとうございます。
https://blog.narito.ninja/detail/30
にあるお手本を用いて実装しようとしています。
この中のpost_formset.htmlの部分を以下のように変えたいです。

追加 
ありがとうございます。
参考にしたかたはgithubに出していらっしゃるのでそれをそのまま使っています。
https://github.com/naritotakizawa/django-modelformset-sample

djangoのformsetを使っています。
そのままのtemplateだと入力して送信をクリックすると、formset.save()は有効でデータベースに保存されます。そしてページを開きなおしても消えません。お手本どおりに動きます。

post_formset.html

{% extends 'app/base.html' %} {% block content %} <form action="" method="post"> <div class="row"> {% for form in formset %} <div class="col-sm-4"> {{ form.as_p }} </div> {% endfor %} </div> {{ formset.management_form }} {% csrf_token %} <button type="submit" class="btn btn-primary">送信</button> </form> {% endblock %}

しかし以下のように変更してみるとformset.save()が反映されていないようで、ページを開きなおすと消えてしまいます。

{% extends 'app/base.html' %} {% block content %} <form action="" method="post"> <div class="row"> {% for form in formset %} <div class="col-sm-4"> {{ form.title }} {{ form.text }} {{ form.date }} </div> {% endfor %} </div> {{ formset.management_form }} {% csrf_token %} <button type="submit" class="btn btn-primary">送信</button> </form> {% endblock %}

view

from django.shortcuts import render, redirect from .forms import PostCreateFormSet def add(request): formset = PostCreateFormSet(request.POST or None) if request.method == 'POST' and formset.is_valid(): formset.save() return redirect('app:index') context = { 'formset': formset } return render(request, 'app/post_formset.html', context)

form

from django import forms from .models import Post class PostCreateForm(forms.ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) for field in self.fields.values(): field.widget.attrs['class'] = 'form-control' class Meta: model = Post fields = '__all__' # これがモデルフォームセット PostCreateFormSet = forms.modelformset_factory( Post, form=PostCreateForm, extra=3 )

model

from django.db import models from django.utils import timezone class Post(models.Model): title = models.CharField('タイトル', max_length=200) text = models.TextField('本文') date = models.DateTimeField('日付', default=timezone.now) def __str__(self): return self.title

form.fieldとした場合の保存方法をご存知の方はいらっしゃいませんか。
よろしくお願いします。

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

dameo

2020/08/10 14:42

ちょっと情報が足りなすぎてよく分かってませんが、ModelFormSetなら、form.fieldもModelなのでは? Modelならsave()ってあった気がするけど、、、 質問するならもっと具体的に動くものをサンプルでも作って載せないと回答付かないと思います。 でなければ、聞きたい部分を絶対他の意味に取れないくらい詳細に説明して、部分ソースを載せるくらいかな。今回はソースの量も少ない上に説明がほぼないため、こういう問答が必要になることが予想されるので、敬遠されちゃったんだと思いますよ。
dameo

2020/08/10 20:57 編集

削除しました
keraker

2020/08/10 23:30

返信ありがとうございます。 修正しました。
dameo

2020/08/10 23:59

すみませんが、情報が全く足りていません。 「以下のようなtemplateだと」ではなくて、完全なソースコードを貼ってください。 また、有効かどうかの判断は具体的にどうやって判断していますか?(デバッガで何行目に止まったからとか、DBで具体的にこう調べたら具体的にこうだったとか、それ以外の方法でどうだったとか) さらに「保存される」「formset.save()が反映」というのもどうやって判断したのか分かりません(DBを見てそう判断したのか、画面上何らかの方法で判断したのか、デバッガで追ったのかなど)。 保存方法もどこでどう保存しているのか全く書かれていません。 ようは、既存のものを変えたのであれば、私が全く同じソースを書けるくらいまで情報がないと、あなたが何を間違えたのかの情報にどうやっても辿り着かないのです。私はそれを推測しながら、小出しにされる情報から何度も何度も手探りで探したくないわけです。 私は回答側にも書いたとおり、誰がやっても同じ結果になるコードを書いています。同じコードを動かせるので、どこを間違えたのか手探りする必要もありません。言ってることが伝わるといいのですが。。。
dameo

2020/08/11 00:23

ちなみに私の書いたコードだとindex.htmlが質問中最初のコードブロックに近く(ただしあなたのコードはそのままでは動きません)、index2.htmlが次のコードブロックに近いです(ただしあなたのコードはそのままでは動きません)。そして、ちゃんとどちらもviews.pyで保存されています。ご参考までに。 viewの書き方的には紹介頂いたサイトの書き方が一般的ですよ。ただ、initialを使った初期化コードはそのままでclean()が動くのかよく分かりません。あなたの情報だけだとそれ以外の未確定要因でいくらでも落ちれるので、見当も付きませんが。
dameo

2020/08/11 02:09

そのまま使ってるんなら変えた部分のソースだけ全部貼ればいいでしょ... 質問する人がそんなに適当なのに、なんで回答する人が全部考えて要求しないと何もしないのか不思議です。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

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

Django

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