質問編集履歴

2

以下を変更しました。タイトル、質問内容、model.py,forms.py,html

2020/09/02 23:57

投稿

RAION
RAION

スコア8

test CHANGED
@@ -1 +1 @@
1
- 多対多紐づけたフィールドのデータ選択してフォームから入力を行いたい
1
+ DjangobootstrapDualListbox()使用して入力を行いたい
test CHANGED
@@ -1,3 +1,395 @@
1
+ ●修正後の質問2
2
+
3
+ 【やりたいこと】
4
+
5
+ DjangoでbootstrapDualListbox()を使用して入力を行いたい
6
+
7
+
8
+
9
+ 【現在の状況】
10
+
11
+ djangoを使用してtodoリストのようなものを作成しようとしております。
12
+
13
+ モデルPost と モデルSyainTable はmany to many で紐づけしております。
14
+
15
+ モデルPostのmust_workerにtodoを行う関係者を入力したく、名前を選択してフォームから入力しようとしております。
16
+
17
+ 入力の際にbootstrapDualListbox()を使用し、リストボックスからリストボックスへの移動をすることで入力を行いたいのですが、上手くいっておりません。
18
+
19
+
20
+
21
+ 【詰まっているところ】
22
+
23
+ forms.py のウィジットを定義するところに加えればよいかと考えたのですが
24
+
25
+ 定義されていないというエラーになりました
26
+
27
+ どこからインポートすればよいかを教えて頂けないでしょうか
28
+
29
+ (ネットで類似を検索したのですが見つけることができませんでした)
30
+
31
+
32
+
33
+ ---
34
+
35
+
36
+
37
+ ```python
38
+
39
+ view.py
40
+
41
+ def post_edit(request, pk):
42
+
43
+ form = PostForm(request.POST)
44
+
45
+ context = {'form': form}
46
+
47
+ post = get_object_or_404(Post, pk=pk)
48
+
49
+ must_workers = post.must_worker.all()
50
+
51
+ if request.method == "POST":#html からpostされたときに通すルート
52
+
53
+
54
+
55
+ form = PostForm(request.POST, instance=post)
56
+
57
+ formset = MustWokerlineFormSet(request.POST, instance=post)
58
+
59
+ if form.is_valid():#ここで選択されたリストをDBに反映したい
60
+
61
+ listret = request.POST.getlist("sample22")
62
+
63
+
64
+
65
+ post = form.save(commit=False)
66
+
67
+ post.author = request.user
68
+
69
+ post.published_date = timezone.now()
70
+
71
+ post.save()
72
+
73
+ formset.save()
74
+
75
+ return redirect('post_detail', pk=post.pk)
76
+
77
+ else:
78
+
79
+ form = PostForm(instance=post)
80
+
81
+ context = {'form': form}
82
+
83
+ context['formset'] = MustWokerlineFormSet(instance=post)
84
+
85
+ context['must_workers'] = must_workers
86
+
87
+ context['must_workers_count'] = must_workers.count()
88
+
89
+ #formset = MustWokerlineFormSet(instance=post)
90
+
91
+ return render(request, 'blog/post_edit.html', context)
92
+
93
+
94
+
95
+ ```
96
+
97
+ ```python
98
+
99
+ forms.py
100
+
101
+ import bootstrap_datepicker_plus as datetimepicker
102
+
103
+ #import bootstrapDualListbox
104
+
105
+
106
+
107
+ from django import forms
108
+
109
+
110
+
111
+ from .models import Post,SyainTable
112
+
113
+ class SyainTableForm(forms.ModelForm):
114
+
115
+
116
+
117
+ class Meta:
118
+
119
+ model = SyainTable
120
+
121
+ fields = ('name', )
122
+
123
+ labels = {
124
+
125
+ 'name': '名前',
126
+
127
+ }
128
+
129
+
130
+
131
+ class PostForm(forms.ModelForm):
132
+
133
+ class Meta:
134
+
135
+ model = Post
136
+
137
+ fields = ('title','text','title2','fixed_date','compleat_date', 'must_worker',)
138
+
139
+ widgets = {
140
+
141
+ 'fixed_date': datetimepicker.DateTimePickerInput(
142
+
143
+ format='%Y-%m-%d %H:%M:%S',
144
+
145
+ options={
146
+
147
+ 'locale': 'ja',
148
+
149
+ 'dayViewHeaderFormat': 'YYYY年 MMMM',
150
+
151
+ }
152
+
153
+ ),
154
+
155
+ 'compleat_date': datetimepicker.DateTimePickerInput(
156
+
157
+ format='%Y-%m-%d %H:%M:%S',
158
+
159
+ options={
160
+
161
+ 'locale': 'ja',
162
+
163
+ 'dayViewHeaderFormat': 'YYYY年 MMMM',
164
+
165
+ }
166
+
167
+ ),
168
+
169
+ #ここ作成途中ブートストラップを入れ込みたい
170
+
171
+ #'must_worker': bootstrapDualListbox(),
172
+
173
+
174
+
175
+ }
176
+
177
+ labels = {
178
+
179
+ 'title': 'Todoタイトル',
180
+
181
+ 'text': 'Todo詳細',
182
+
183
+ 'title2': '記入者',
184
+
185
+ 'fixed_date': '期日',
186
+
187
+ 'compleat_date': '完了日',
188
+
189
+ 'must_worker': '対象者',
190
+
191
+ }
192
+
193
+ exclude = ('SyainTable',)
194
+
195
+
196
+
197
+ ```
198
+
199
+
200
+
201
+ ```python
202
+
203
+ model.py
204
+
205
+ from django.db import models
206
+
207
+ from django.utils import timezone
208
+
209
+
210
+
211
+ class Post(models.Model):
212
+
213
+ author = models.ForeignKey('auth.User',on_delete=models.CASCADE)
214
+
215
+ title = models.CharField(max_length=200)
216
+
217
+ title2 = models.CharField(max_length=200)
218
+
219
+
220
+
221
+ text = models.TextField()
222
+
223
+ created_date = models.DateTimeField(
224
+
225
+ default=timezone.now)
226
+
227
+ published_date = models.DateTimeField(
228
+
229
+ blank=True, null=True)
230
+
231
+
232
+
233
+ fixed_date = models.DateTimeField(
234
+
235
+ blank=True, null=True)
236
+
237
+ compleat_date = models.DateTimeField(
238
+
239
+ blank=True, null=True)
240
+
241
+
242
+
243
+ must_worker = models.ManyToManyField("SyainTable", related_name="must")
244
+
245
+
246
+
247
+ def publish(self):
248
+
249
+ self.published_date = timezone.now()
250
+
251
+ self.save()
252
+
253
+
254
+
255
+ def __str__(self):
256
+
257
+ return self.title
258
+
259
+
260
+
261
+ #社員テーブル
262
+
263
+ class SyainTable(models.Model):
264
+
265
+ SyainNo = models.IntegerField(primary_key=True)
266
+
267
+ name = models.CharField(max_length=20)
268
+
269
+
270
+
271
+ def __str__(self):#このメソッドで管理画面等で表示するものを決めてます
272
+
273
+ return self.name
274
+
275
+
276
+
277
+
278
+
279
+
280
+
281
+ ```
282
+
283
+ ```HTML
284
+
285
+ post_edit.html
286
+
287
+ {% extends 'blog/base.html' %}
288
+
289
+
290
+
291
+ {% block content %}
292
+
293
+ <div id="content" class="colM">
294
+
295
+ <h1>編集</h1>
296
+
297
+ <form method="POST" class="post-form">{% csrf_token %}
298
+
299
+
300
+
301
+ <h2>対象者入力</h2>
302
+
303
+ <select multiple="multiple" size="{{must_workers_count}}" id="sample"><!--セレクトボックスに社員テーブルに名前がある人を表示する-->
304
+
305
+ {% for must_worker in must_workers %}
306
+
307
+ <option value="option{{ forloop.counter }}">{{must_worker.name}} </option>
308
+
309
+ {% endfor %}
310
+
311
+ </select>
312
+
313
+
314
+
315
+ {{ form.as_p }}
316
+
317
+
318
+
319
+ <h2>追加部分</h2>
320
+
321
+ {{ formset.management_form }}
322
+
323
+ {% for nnfile_form in formset %}
324
+
325
+ {{ nnfile_form.as_p }}
326
+
327
+ <hr>
328
+
329
+ {% endfor %}
330
+
331
+
332
+
333
+ <button type="submit" class="save btn btn-default">Save</button><!--これを実行したあとは呼び元のVIEWに戻る-->
334
+
335
+ </form>
336
+
337
+
338
+
339
+
340
+
341
+ </div>
342
+
343
+ {% endblock %}
344
+
345
+
346
+
347
+ ```
348
+
349
+
350
+
351
+
352
+
353
+ ---
354
+
355
+
356
+
357
+ 以下は修正前の質問をメモとして残しているだけで参照不要です。
358
+
359
+ ●修正後の質問1
360
+
361
+ djangoを使用してtodoリストのようなものを作成しようとしております。
362
+
363
+
364
+
365
+ モデルPost と モデルSyainTable はmany to many で紐づけしております。
366
+
367
+ モデルPostのmust_workerにtodoを行う関係者を入力したく、名前を選択してフォームから入力したいというのがやりたいことになります。
368
+
369
+
370
+
371
+
372
+
373
+ 現在できているところは
374
+
375
+ htmlの以下の箇所で
376
+
377
+ {% for nnfile_form in formset %}
378
+
379
+ {{ nnfile_form.as_p }}
380
+
381
+ <hr>
382
+
383
+ {% endfor %}
384
+
385
+ 紐づけたものを使い、入力フォームを表示させているのですが、object1,object2という、社員テーブルの行を表示したような
386
+
387
+ セレクトボックスの表示となり、名前を表示しての選択ができませんでした
388
+
389
+ ここで名前を選択して入力させるにはどのようにしたらよいでしょうか。
390
+
391
+
392
+
1
393
  ●修正前の質問
2
394
 
3
395
  タイトル:「リストボックスで選択した値をview.pyで参照する方法を知りたい」
@@ -21,327 +413,3 @@
21
413
 
22
414
 
23
415
  ---
24
-
25
- ●修正後の質問
26
-
27
- djangoを使用してtodoリストのようなものを作成しようとしております。
28
-
29
-
30
-
31
- モデルPost と モデルSyainTable はmany to many で紐づけしております。
32
-
33
- モデルPostのmust_workerにtodoを行う関係者を入力したく、名前を選択してフォームから入力したいというのがやりたいことになります。
34
-
35
-
36
-
37
-
38
-
39
- 現在できているところは
40
-
41
- htmlの以下の箇所で
42
-
43
- {% for nnfile_form in formset %}
44
-
45
- {{ nnfile_form.as_p }}
46
-
47
- <hr>
48
-
49
- {% endfor %}
50
-
51
- 紐づけたものを使い、入力フォームを表示させているのですが、object1,object2という、社員テーブルの行を表示したような
52
-
53
- セレクトボックスの表示となり、名前を表示しての選択ができませんでした
54
-
55
- ここで名前を選択して入力させるにはどのようにしたらよいでしょうか。
56
-
57
-
58
-
59
- ---
60
-
61
-
62
-
63
- ```python
64
-
65
- view.py
66
-
67
- def post_edit(request, pk):
68
-
69
- form = PostForm(request.POST)
70
-
71
- context = {'form': form}
72
-
73
- post = get_object_or_404(Post, pk=pk)
74
-
75
- must_workers = post.must_worker.all()
76
-
77
- if request.method == "POST":#html からpostされたときに通すルート
78
-
79
-
80
-
81
- form = PostForm(request.POST, instance=post)
82
-
83
- formset = MustWokerlineFormSet(request.POST, instance=post)
84
-
85
- if form.is_valid():#ここで選択されたリストをDBに反映したい
86
-
87
- listret = request.POST.getlist("sample22")
88
-
89
-
90
-
91
- post = form.save(commit=False)
92
-
93
- post.author = request.user
94
-
95
- post.published_date = timezone.now()
96
-
97
- post.save()
98
-
99
- formset.save()
100
-
101
- return redirect('post_detail', pk=post.pk)
102
-
103
- else:
104
-
105
- form = PostForm(instance=post)
106
-
107
- context = {'form': form}
108
-
109
- context['formset'] = MustWokerlineFormSet(instance=post)
110
-
111
- context['must_workers'] = must_workers
112
-
113
- context['must_workers_count'] = must_workers.count()
114
-
115
- #formset = MustWokerlineFormSet(instance=post)
116
-
117
- return render(request, 'blog/post_edit.html', context)
118
-
119
-
120
-
121
- ```
122
-
123
- ```python
124
-
125
- forms.py
126
-
127
- import bootstrap_datepicker_plus as datetimepicker
128
-
129
-
130
-
131
- from django import forms
132
-
133
-
134
-
135
- from .models import Post,SyainTable
136
-
137
- class SyainTableForm(forms.ModelForm):
138
-
139
-
140
-
141
- class Meta:
142
-
143
- model = SyainTable
144
-
145
- fields = ('name', )
146
-
147
- labels = {
148
-
149
- 'name': '名前',
150
-
151
- }
152
-
153
-
154
-
155
- class PostForm(forms.ModelForm):
156
-
157
-
158
-
159
- class Meta:
160
-
161
- model = Post
162
-
163
- fields = ('title','text','title2','fixed_date','compleat_date', )
164
-
165
- widgets = {
166
-
167
- 'fixed_date': datetimepicker.DateTimePickerInput(
168
-
169
- format='%Y-%m-%d %H:%M:%S',
170
-
171
- options={
172
-
173
- 'locale': 'ja',
174
-
175
- 'dayViewHeaderFormat': 'YYYY年 MMMM',
176
-
177
- }
178
-
179
- ),
180
-
181
- 'compleat_date': datetimepicker.DateTimePickerInput(
182
-
183
- format='%Y-%m-%d %H:%M:%S',
184
-
185
- options={
186
-
187
- 'locale': 'ja',
188
-
189
- 'dayViewHeaderFormat': 'YYYY年 MMMM',
190
-
191
- }
192
-
193
- ),
194
-
195
- }
196
-
197
- labels = {
198
-
199
- 'title': 'Todoタイトル',
200
-
201
- 'text': 'Todo詳細',
202
-
203
- 'title2': '記入者',
204
-
205
- 'fixed_date': '期日',
206
-
207
- 'compleat_date': '完了日',
208
-
209
- }
210
-
211
- exclude = ('SyainTable',)
212
-
213
-
214
-
215
- MustWokerlineFormSet = forms.inlineformset_factory(
216
-
217
- Post, Post.must_worker.through, fields='__all__', can_delete=False,max_num=3
218
-
219
- )
220
-
221
-
222
-
223
- ```
224
-
225
-
226
-
227
- ```python
228
-
229
- model.py
230
-
231
- from django.db import models
232
-
233
- from django.utils import timezone
234
-
235
-
236
-
237
- class Post(models.Model):
238
-
239
- author = models.ForeignKey('auth.User',on_delete=models.CASCADE)
240
-
241
- title = models.CharField(max_length=200)
242
-
243
- title2 = models.CharField(max_length=200)
244
-
245
-
246
-
247
- text = models.TextField()
248
-
249
- created_date = models.DateTimeField(
250
-
251
- default=timezone.now)
252
-
253
- published_date = models.DateTimeField(
254
-
255
- blank=True, null=True)
256
-
257
-
258
-
259
- fixed_date = models.DateTimeField(
260
-
261
- blank=True, null=True)
262
-
263
- compleat_date = models.DateTimeField(
264
-
265
- blank=True, null=True)
266
-
267
-
268
-
269
- must_worker = models.ManyToManyField("SyainTable", related_name="must")
270
-
271
-
272
-
273
- def publish(self):
274
-
275
- self.published_date = timezone.now()
276
-
277
- self.save()
278
-
279
-
280
-
281
- def __str__(self):
282
-
283
- return self.title
284
-
285
-
286
-
287
- #社員テーブル
288
-
289
- class SyainTable(models.Model):
290
-
291
- SyainNo = models.IntegerField(primary_key=True)
292
-
293
- name = models.CharField(max_length=20)
294
-
295
-
296
-
297
-
298
-
299
- ```
300
-
301
- ```HTML
302
-
303
- post_edit.html
304
-
305
-
306
-
307
- {% extends 'blog/base.html' %}
308
-
309
-
310
-
311
- {% block content %}
312
-
313
- <div id="content" class="colM">
314
-
315
- <h1>編集</h1>
316
-
317
- <form method="POST" class="post-form">{% csrf_token %}
318
-
319
- {{ form.as_p }}
320
-
321
-
322
-
323
- <h2>追加部分</h2>
324
-
325
- {{ formset.management_form }}
326
-
327
- {% for nnfile_form in formset %}
328
-
329
- {{ nnfile_form.as_p }}
330
-
331
- <hr>
332
-
333
- {% endfor %}
334
-
335
-
336
-
337
- <button type="submit" class="save btn btn-default">Save</button>
338
-
339
- </form>
340
-
341
- </div>
342
-
343
- {% endblock %}
344
-
345
-
346
-
347
- ```

1

タイトル変更、画像イメージ削除、修正後の質問を追記、ソース:forms.py,model.pyの追加

2020/09/02 23:57

投稿

RAION
RAION

スコア8

test CHANGED
@@ -1 +1 @@
1
- リストボックスで選択した値view.pyで参照する方法を知りたい
1
+ 多対多紐づけたフィールドのデータを選択してフォームから入力行いたい
test CHANGED
@@ -1,3 +1,7 @@
1
+ ●修正前の質問
2
+
3
+ タイトル:「リストボックスで選択した値をview.pyで参照する方法を知りたい」
4
+
1
5
  bootstrapDualListboxを使用して
2
6
 
3
7
  以下画像のような、選択前から選択済に移動させるタイプのリストボックスを表示したのですが
@@ -14,13 +18,41 @@
14
18
 
15
19
 
16
20
 
21
+
22
+
17
23
  ---
18
24
 
25
+ ●修正後の質問
26
+
27
+ djangoを使用してtodoリストのようなものを作成しようとしております。
28
+
29
+
30
+
31
+ モデルPost と モデルSyainTable はmany to many で紐づけしております。
32
+
33
+ モデルPostのmust_workerにtodoを行う関係者を入力したく、名前を選択してフォームから入力したいというのがやりたいことになります。
34
+
35
+
36
+
37
+
38
+
39
+ 現在できているところは
40
+
41
+ htmlの以下の箇所で
42
+
43
+ {% for nnfile_form in formset %}
44
+
45
+ {{ nnfile_form.as_p }}
46
+
19
- **画面イメージ**
47
+ <hr>
48
+
20
-
49
+ {% endfor %}
50
+
21
- ![イメジ説明](721554442897a2200d8083e7d50baa1c.png)
51
+ 紐づけたものを使い、入力フォムを表示させているのですが、object1,object2という、社員テーブルの行を表示したような
52
+
22
-
53
+ セレクトボックスの表示となり、名前を表示しての選択ができませんでした
54
+
23
-
55
+ ここで名前を選択して入力させるにはどのようにしたらよいでしょうか。
24
56
 
25
57
 
26
58
 
@@ -88,6 +120,184 @@
88
120
 
89
121
  ```
90
122
 
123
+ ```python
124
+
125
+ forms.py
126
+
127
+ import bootstrap_datepicker_plus as datetimepicker
128
+
129
+
130
+
131
+ from django import forms
132
+
133
+
134
+
135
+ from .models import Post,SyainTable
136
+
137
+ class SyainTableForm(forms.ModelForm):
138
+
139
+
140
+
141
+ class Meta:
142
+
143
+ model = SyainTable
144
+
145
+ fields = ('name', )
146
+
147
+ labels = {
148
+
149
+ 'name': '名前',
150
+
151
+ }
152
+
153
+
154
+
155
+ class PostForm(forms.ModelForm):
156
+
157
+
158
+
159
+ class Meta:
160
+
161
+ model = Post
162
+
163
+ fields = ('title','text','title2','fixed_date','compleat_date', )
164
+
165
+ widgets = {
166
+
167
+ 'fixed_date': datetimepicker.DateTimePickerInput(
168
+
169
+ format='%Y-%m-%d %H:%M:%S',
170
+
171
+ options={
172
+
173
+ 'locale': 'ja',
174
+
175
+ 'dayViewHeaderFormat': 'YYYY年 MMMM',
176
+
177
+ }
178
+
179
+ ),
180
+
181
+ 'compleat_date': datetimepicker.DateTimePickerInput(
182
+
183
+ format='%Y-%m-%d %H:%M:%S',
184
+
185
+ options={
186
+
187
+ 'locale': 'ja',
188
+
189
+ 'dayViewHeaderFormat': 'YYYY年 MMMM',
190
+
191
+ }
192
+
193
+ ),
194
+
195
+ }
196
+
197
+ labels = {
198
+
199
+ 'title': 'Todoタイトル',
200
+
201
+ 'text': 'Todo詳細',
202
+
203
+ 'title2': '記入者',
204
+
205
+ 'fixed_date': '期日',
206
+
207
+ 'compleat_date': '完了日',
208
+
209
+ }
210
+
211
+ exclude = ('SyainTable',)
212
+
213
+
214
+
215
+ MustWokerlineFormSet = forms.inlineformset_factory(
216
+
217
+ Post, Post.must_worker.through, fields='__all__', can_delete=False,max_num=3
218
+
219
+ )
220
+
221
+
222
+
223
+ ```
224
+
225
+
226
+
227
+ ```python
228
+
229
+ model.py
230
+
231
+ from django.db import models
232
+
233
+ from django.utils import timezone
234
+
235
+
236
+
237
+ class Post(models.Model):
238
+
239
+ author = models.ForeignKey('auth.User',on_delete=models.CASCADE)
240
+
241
+ title = models.CharField(max_length=200)
242
+
243
+ title2 = models.CharField(max_length=200)
244
+
245
+
246
+
247
+ text = models.TextField()
248
+
249
+ created_date = models.DateTimeField(
250
+
251
+ default=timezone.now)
252
+
253
+ published_date = models.DateTimeField(
254
+
255
+ blank=True, null=True)
256
+
257
+
258
+
259
+ fixed_date = models.DateTimeField(
260
+
261
+ blank=True, null=True)
262
+
263
+ compleat_date = models.DateTimeField(
264
+
265
+ blank=True, null=True)
266
+
267
+
268
+
269
+ must_worker = models.ManyToManyField("SyainTable", related_name="must")
270
+
271
+
272
+
273
+ def publish(self):
274
+
275
+ self.published_date = timezone.now()
276
+
277
+ self.save()
278
+
279
+
280
+
281
+ def __str__(self):
282
+
283
+ return self.title
284
+
285
+
286
+
287
+ #社員テーブル
288
+
289
+ class SyainTable(models.Model):
290
+
291
+ SyainNo = models.IntegerField(primary_key=True)
292
+
293
+ name = models.CharField(max_length=20)
294
+
295
+
296
+
297
+
298
+
299
+ ```
300
+
91
301
  ```HTML
92
302
 
93
303
  post_edit.html
@@ -124,56 +334,6 @@
124
334
 
125
335
 
126
336
 
127
- <h2>追加部分その3</h2>
128
-
129
- <select multiple="multiple" size="{{must_workers_count}}" id="sample">
130
-
131
- {% for must_worker in must_workers %}
132
-
133
- <option value="option{{ forloop.counter }}">{{must_worker.name}} </option>
134
-
135
- {% endfor %}
136
-
137
- </select>
138
-
139
-
140
-
141
- <script type="text/javascript">
142
-
143
- var demo1 = $('#sample').bootstrapDualListbox({
144
-
145
- filterTextClear:'全件表示',
146
-
147
- filterPlaceHolder:'検索',
148
-
149
- moveSelectedLabel:'選択済みに移動',
150
-
151
- moveAllLabel:'選択済みに全て移動',
152
-
153
- removeSelectedLabel:'選択を解除',
154
-
155
- removeAllLabel:'選択を全て解除',
156
-
157
- moveOnSelect: false,
158
-
159
- nonSelectedListLabel: '一覧',
160
-
161
- selectedListLabel: '選択済み一覧',
162
-
163
- infoText:'{0}件',
164
-
165
- showFilterInputs:true,
166
-
167
- infoTextEmpty:'0件',
168
-
169
- infoTextFiltered:'{1}件中{0}件表示',
170
-
171
- });
172
-
173
- </script>
174
-
175
-
176
-
177
337
  <button type="submit" class="save btn btn-default">Save</button>
178
338
 
179
339
  </form>