追加
返信ありがとうございます。
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
1{% extends 'app/base.html' %} 2 3{% block content %} 4<form action="" method="post"> 5 <div class="row"> 6 {% for form in formset %} 7 <div class="col-sm-4"> 8 {{ form.as_p }} 9 </div> 10 {% endfor %} 11 </div> 12 {{ formset.management_form }} 13 {% csrf_token %} 14 <button type="submit" class="btn btn-primary">送信</button> 15</form> 16{% 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とした場合の保存方法をご存知の方はいらっしゃいませんか。
よろしくお願いします。
ちょっと情報が足りなすぎてよく分かってませんが、ModelFormSetなら、form.fieldもModelなのでは?
Modelならsave()ってあった気がするけど、、、
質問するならもっと具体的に動くものをサンプルでも作って載せないと回答付かないと思います。
でなければ、聞きたい部分を絶対他の意味に取れないくらい詳細に説明して、部分ソースを載せるくらいかな。今回はソースの量も少ない上に説明がほぼないため、こういう問答が必要になることが予想されるので、敬遠されちゃったんだと思いますよ。
削除しました
返信ありがとうございます。
修正しました。
すみませんが、情報が全く足りていません。
「以下のようなtemplateだと」ではなくて、完全なソースコードを貼ってください。
また、有効かどうかの判断は具体的にどうやって判断していますか?(デバッガで何行目に止まったからとか、DBで具体的にこう調べたら具体的にこうだったとか、それ以外の方法でどうだったとか)
さらに「保存される」「formset.save()が反映」というのもどうやって判断したのか分かりません(DBを見てそう判断したのか、画面上何らかの方法で判断したのか、デバッガで追ったのかなど)。
保存方法もどこでどう保存しているのか全く書かれていません。
ようは、既存のものを変えたのであれば、私が全く同じソースを書けるくらいまで情報がないと、あなたが何を間違えたのかの情報にどうやっても辿り着かないのです。私はそれを推測しながら、小出しにされる情報から何度も何度も手探りで探したくないわけです。
私は回答側にも書いたとおり、誰がやっても同じ結果になるコードを書いています。同じコードを動かせるので、どこを間違えたのか手探りする必要もありません。言ってることが伝わるといいのですが。。。
ちなみに私の書いたコードだとindex.htmlが質問中最初のコードブロックに近く(ただしあなたのコードはそのままでは動きません)、index2.htmlが次のコードブロックに近いです(ただしあなたのコードはそのままでは動きません)。そして、ちゃんとどちらもviews.pyで保存されています。ご参考までに。
viewの書き方的には紹介頂いたサイトの書き方が一般的ですよ。ただ、initialを使った初期化コードはそのままでclean()が動くのかよく分かりません。あなたの情報だけだとそれ以外の未確定要因でいくらでも落ちれるので、見当も付きませんが。
そのまま使ってるんなら変えた部分のソースだけ全部貼ればいいでしょ...
質問する人がそんなに適当なのに、なんで回答する人が全部考えて要求しないと何もしないのか不思議です。
回答2件
あなたの回答
tips
プレビュー