teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

6

追加

2020/08/11 02:53

投稿

keraker
keraker

スコア46

title CHANGED
File without changes
body CHANGED
@@ -73,6 +73,42 @@
73
73
 
74
74
  return render(request, 'app/post_formset.html', context)
75
75
  ```
76
+ form
77
+ ```
78
+ from django import forms
79
+ from .models import Post
76
80
 
81
+
82
+ class PostCreateForm(forms.ModelForm):
83
+
84
+ def __init__(self, *args, **kwargs):
85
+ super().__init__(*args, **kwargs)
86
+ for field in self.fields.values():
87
+ field.widget.attrs['class'] = 'form-control'
88
+
89
+ class Meta:
90
+ model = Post
91
+ fields = '__all__'
92
+
93
+
94
+ # これがモデルフォームセット
95
+ PostCreateFormSet = forms.modelformset_factory(
96
+ Post, form=PostCreateForm, extra=3
97
+ )
98
+ ```
99
+ model
100
+ ```
101
+ from django.db import models
102
+ from django.utils import timezone
103
+
104
+
105
+ class Post(models.Model):
106
+ title = models.CharField('タイトル', max_length=200)
107
+ text = models.TextField('本文')
108
+ date = models.DateTimeField('日付', default=timezone.now)
109
+
110
+ def __str__(self):
111
+ return self.title
112
+ ```
77
113
  form.fieldとした場合の保存方法をご存知の方はいらっしゃいませんか。
78
114
  よろしくお願いします。

5

修正

2020/08/11 02:53

投稿

keraker
keraker

スコア46

title CHANGED
File without changes
body CHANGED
@@ -12,19 +12,35 @@
12
12
 
13
13
 
14
14
  djangoのformsetを使っています。
15
- そのままのtemplateだと入力して送信をクリックすると、formset.save()は有効でデータベースに保存されます。そしてページを開きなおしても消えません。
15
+ そのままのtemplateだと入力して送信をクリックすると、formset.save()は有効でデータベースに保存されます。そしてページを開きなおしても消えません。お手本どおりに動きます。
16
16
 
17
- ```
17
+ ```post_formset.html
18
+ {% extends 'app/base.html' %}
19
+
20
+ {% block content %}
21
+ <form action="" method="post">
22
+ <div class="row">
18
23
  {% for form in formset %}
19
24
  <div class="col-sm-4">
20
25
  {{ form.as_p }}
21
26
  </div>
22
27
  {% endfor %}
28
+ </div>
29
+ {{ formset.management_form }}
30
+ {% csrf_token %}
31
+ <button type="submit" class="btn btn-primary">送信</button>
32
+ </form>
33
+ {% endblock %}
23
34
  ```
24
35
 
25
36
  しかし以下のように変更してみるとformset.save()が反映されていないようで、ページを開きなおすと消えてしまいます。
26
37
 
27
38
  ```
39
+ {% extends 'app/base.html' %}
40
+
41
+ {% block content %}
42
+ <form action="" method="post">
43
+ <div class="row">
28
44
  {% for form in formset %}
29
45
  <div class="col-sm-4">
30
46
  {{ form.title }}
@@ -32,13 +48,30 @@
32
48
  {{ form.date }}
33
49
  </div>
34
50
  {% endfor %}
51
+ </div>
52
+ {{ formset.management_form }}
53
+ {% csrf_token %}
54
+ <button type="submit" class="btn btn-primary">送信</button>
55
+ </form>
56
+ {% endblock %}
35
57
  ```
36
- 保存方法
58
+ view
37
59
  ```
60
+ from django.shortcuts import render, redirect
61
+ from .forms import PostCreateFormSet
62
+
63
+
64
+ def add(request):
38
- formset = PostCreateFormSet(request.POST or None)
65
+ formset = PostCreateFormSet(request.POST or None)
39
66
  if request.method == 'POST' and formset.is_valid():
40
67
  formset.save()
41
-     return redirect('app:index')
68
+ return redirect('app:index')
69
+
70
+ context = {
71
+ 'formset': formset
72
+ }
73
+
74
+ return render(request, 'app/post_formset.html', context)
42
75
  ```
43
76
 
44
77
  form.fieldとした場合の保存方法をご存知の方はいらっしゃいませんか。

4

追加

2020/08/11 02:49

投稿

keraker
keraker

スコア46

title CHANGED
File without changes
body CHANGED
@@ -4,24 +4,33 @@
4
4
  にあるお手本を用いて実装しようとしています。
5
5
  この中のpost_formset.htmlの部分を以下のように変えたいです。
6
6
 
7
+ 追加 
8
+ ありがとうございます。
9
+ 参考にしたかたはgithubに出していらっしゃるのでそれをそのまま使っています。
10
+ https://github.com/naritotakizawa/django-modelformset-sample
7
11
 
8
12
 
13
+
9
14
  djangoのformsetを使っています。
10
- 以下ようなtemplateだとformset.save()は有効で保存されます。
15
+ ままのtemplateだと入力して送信をクリックすると、formset.save()は有効でデータベースに保存されます。そしてページを開きなおしても消えません。
11
16
 
12
17
  ```
13
18
  {% for form in formset %}
19
+ <div class="col-sm-4">
14
- {{ form }}
20
+ {{ form.as_p }}
21
+ </div>
15
22
  {% endfor %}
16
23
  ```
17
24
 
18
- しかし以下のようとformset.save()が反映されません
25
+ しかし以下のように変更してみるとformset.save()が反映されていないようで、ページを開きなおすと消えてしいます
19
- なおnameは仮称です。
20
26
 
21
27
  ```
22
28
  {% for form in formset %}
29
+ <div class="col-sm-4">
30
+ {{ form.title }}
31
+ {{ form.text }}
23
-       {{ form.name }}
32
+ {{ form.date }}
24
-       {{ form.name2 }}
33
+ </div>
25
34
  {% endfor %}
26
35
  ```
27
36
  保存方法

3

追加

2020/08/11 01:16

投稿

keraker
keraker

スコア46

title CHANGED
File without changes
body CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
 
9
9
  djangoのformsetを使っています。
10
- 以下のようなtemplateだと保存されます。
10
+ 以下のようなtemplateだとformset.save()は有効で、保存されます。
11
11
 
12
12
  ```
13
13
  {% for form in formset %}
@@ -15,7 +15,7 @@
15
15
  {% endfor %}
16
16
  ```
17
17
 
18
- しかし以下のようだとできません。
18
+ しかし以下のようだとformset.save()が反映されません。
19
19
  なおnameは仮称です。
20
20
 
21
21
  ```

2

追加

2020/08/10 23:29

投稿

keraker
keraker

スコア46

title CHANGED
File without changes
body CHANGED
@@ -1,3 +1,11 @@
1
+ 追加
2
+ 返信ありがとうございます。
3
+ https://blog.narito.ninja/detail/30
4
+ にあるお手本を用いて実装しようとしています。
5
+ この中のpost_formset.htmlの部分を以下のように変えたいです。
6
+
7
+
8
+
1
9
  djangoのformsetを使っています。
2
10
  以下のようなtemplateだと保存されます。
3
11
 
@@ -8,6 +16,7 @@
8
16
  ```
9
17
 
10
18
  しかし以下のようだとできません。
19
+ なおnameは仮称です。
11
20
 
12
21
  ```
13
22
  {% for form in formset %}

1

追加

2020/08/10 23:26

投稿

keraker
keraker

スコア46

title CHANGED
File without changes
body CHANGED
@@ -15,6 +15,13 @@
15
15
        {{ form.name2 }}
16
16
  {% endfor %}
17
17
  ```
18
+ 保存方法
19
+ ```
20
+ formset = PostCreateFormSet(request.POST or None)
21
+ if request.method == 'POST' and formset.is_valid():
22
+ formset.save()
23
+     return redirect('app:index')
24
+ ```
18
25
 
19
26
  form.fieldとした場合の保存方法をご存知の方はいらっしゃいませんか。
20
27
  よろしくお願いします。