回答編集履歴

3

実行結果について記述しました

2018/06/20 10:07

投稿

tatamyiwathy
tatamyiwathy

スコア1039

test CHANGED
@@ -196,6 +196,8 @@
196
196
 
197
197
 
198
198
 
199
+ **実行結果**
200
+
199
201
 
200
202
 
201
203
  ![実行結果](f96ff5f6a134ca25285e2c2f63be1645.png)

2

実行結果の画像を掲載しました

2018/06/20 10:07

投稿

tatamyiwathy
tatamyiwathy

スコア1039

test CHANGED
@@ -198,4 +198,4 @@
198
198
 
199
199
 
200
200
 
201
- [実行結果](bb61d10402fdbf79851b5118d7f47351.png)
201
+ ![実行結果](f96ff5f6a134ca25285e2c2f63be1645.png)

1

回答したあと気になったので少し実装してみました。ManyToManyFieldではなくForeignKeyを使用していますので質問者様の意図から外れてるかもしれません。

2018/06/20 10:06

投稿

tatamyiwathy
tatamyiwathy

スコア1039

test CHANGED
@@ -3,3 +3,199 @@
3
3
 
4
4
 
5
5
  ただ、もし自分だったらスキルの値を入力するフォームをスキル数分用意しちゃうと思います。
6
+
7
+
8
+
9
+
10
+
11
+ **追記しました**
12
+
13
+ Formを複数使用する方法で実装してみました。
14
+
15
+ これ質問者様の意図したこととあってますでしょうか
16
+
17
+
18
+
19
+ Python 3.5.2
20
+
21
+ Django 2.0
22
+
23
+
24
+
25
+ **models.py**
26
+
27
+ ```python
28
+
29
+ from django import forms
30
+
31
+ from django.db import models
32
+
33
+
34
+
35
+
36
+
37
+ class Skill(models.Model):
38
+
39
+ name = models.CharField(max_length=16, blank=True, null=False)
40
+
41
+ value = models.IntegerField()
42
+
43
+ owner = models.ForeignKey(
44
+
45
+ 'Person', blank=True, null=True, on_delete=models.CASCADE)
46
+
47
+
48
+
49
+ def __str__(self):
50
+
51
+ return '%s %d' % (self.name, self.value)
52
+
53
+
54
+
55
+
56
+
57
+ class Person(models.Model):
58
+
59
+ name = models.CharField(max_length=16, blank=True, null=False)
60
+
61
+
62
+
63
+ def __str__(self):
64
+
65
+ return self.name
66
+
67
+
68
+
69
+
70
+
71
+ class PersonForm(forms.ModelForm):
72
+
73
+ class Meta:
74
+
75
+ model = Person
76
+
77
+ fields = {'name'}
78
+
79
+
80
+
81
+
82
+
83
+ class SkillForm(forms.ModelForm):
84
+
85
+ class Meta:
86
+
87
+ model = Skill
88
+
89
+ fields = {'name', 'value'}
90
+
91
+ ```
92
+
93
+
94
+
95
+ **views.pyの一部**
96
+
97
+ ```python
98
+
99
+ def edit(request, person_id):
100
+
101
+ person = Person.objects.get(id=person_id)
102
+
103
+ skills = Skill.objects.filter(owner=person)
104
+
105
+ if request.method == 'POST':
106
+
107
+ personform = PersonForm(request.POST, instance=person, prefix='person')
108
+
109
+ skillforms = [SkillForm(request.POST, instance=skill,
110
+
111
+ prefix=skill.name) for skill in skills]
112
+
113
+ if personform.is_valid():
114
+
115
+ for form in skillforms:
116
+
117
+ if not form.is_valid():
118
+
119
+ break
120
+
121
+ form.save()
122
+
123
+ else:
124
+
125
+ return redirect('skill:home')
126
+
127
+ else:
128
+
129
+ personform = PersonForm(instance=person, prefix='person')
130
+
131
+ skillforms = [SkillForm(instance=skill, prefix=skill.name)
132
+
133
+ for skill in skills]
134
+
135
+ return render(request, 'skill/skill.html', {'personform': personform,
136
+
137
+ 'skillforms': skillforms,
138
+
139
+ 'person_id': person.id})
140
+
141
+ ```
142
+
143
+
144
+
145
+ **urls.pyの一部**
146
+
147
+ ```python
148
+
149
+ urlpatterns = [
150
+
151
+ path('edit/<int:person_id>', views.edit, name='edit'),
152
+
153
+ ]
154
+
155
+ ```
156
+
157
+
158
+
159
+ **skill.html**
160
+
161
+ ```html
162
+
163
+ <html>
164
+
165
+ <body>
166
+
167
+ <form action="{% url 'skill:edit' person_id %}" method="POST">
168
+
169
+ <table>
170
+
171
+ {{ personform.as_table }}
172
+
173
+
174
+
175
+ {% for skillform in skillforms %}
176
+
177
+ {{ skillform.as_table }}
178
+
179
+ {%endfor%}
180
+
181
+ </table>
182
+
183
+ {% csrf_token %}
184
+
185
+ <input type="submit" value="登録">
186
+
187
+ </form>
188
+
189
+ </body>
190
+
191
+ </html>
192
+
193
+ ```
194
+
195
+
196
+
197
+
198
+
199
+
200
+
201
+ [実行結果](bb61d10402fdbf79851b5118d7f47351.png)