回答編集履歴

2

コードに `else` が欠けていたのを追加しました。

2018/11/02 12:18

投稿

gh640
gh640

スコア1407

test CHANGED
@@ -94,9 +94,9 @@
94
94
 
95
95
  # return redirect(to='/hello/food')
96
96
 
97
+ else:
97
98
 
98
-
99
- form = FoodForm()
99
+ form = FoodForm()
100
100
 
101
101
  params = {
102
102
 

1

追記 2018/11/01 21:43: の部分を追記しました。

2018/11/02 12:18

投稿

gh640
gh640

スコア1407

test CHANGED
@@ -37,3 +37,109 @@
37
37
 
38
38
 
39
39
  - https://github.com/goinnn/django-multiselectfield
40
+
41
+
42
+
43
+ 追記 2018/11/01 21:43:
44
+
45
+
46
+
47
+ 以下、 2018/11/01 19:12 にいただいたコメントに対する回答です。
48
+
49
+
50
+
51
+ > Food.objects.create(food=',',join(form.cleaned_data["food"]))を書いて実行すると、
52
+
53
+ > 下記のエラーメッセージが出てしまいます。
54
+
55
+ > 'Food' object has no attribute 'cleaned_data'
56
+
57
+
58
+
59
+ `cleaned_data` は `Form` インスタンスのアトリビュートなのですが、そのエラーが出るということは `Food` のインスタンスに対して `cleaned_data` アトリビュートにアクセスしようとされているのだと思います。そうではないので、以下読み進めてください。
60
+
61
+
62
+
63
+ > cleaned_dataという処理をやっていないためだと思います。上記に示したコードで書き換えると、どのようなコードになりますでしょうか?
64
+
65
+
66
+
67
+ `cleaned_data` は `Form.is_valid()` を呼び出して成功したときにセットされるアトリビュートです。ですので、通常のライフサイクルでは `form.is_valid()` が `True` だったときに利用するものです。詳しくは公式のドキュメントの次の場所をご覧ください:
68
+
69
+
70
+
71
+ - https://docs.djangoproject.com/en/2.1/ref/forms/api/#accessing-clean-data
72
+
73
+
74
+
75
+ 「 上記に示したコードで書き換えると、どのようなコードになりますでしょうか? 」への回答としては、次のようなイメージになるでしょうか(なるべく原形を残すように努めました)。
76
+
77
+
78
+
79
+ ```python
80
+
81
+ # views.py:
82
+
83
+ def foodsettei(request):
84
+
85
+ if request.method == 'POST':
86
+
87
+ form = FoodForm(request.POST)
88
+
89
+ if form.is_valid():
90
+
91
+ selected_foods = form.cleaned_data["food"]
92
+
93
+ Food.objects.create(food=','.join(selected_foods))
94
+
95
+ # return redirect(to='/hello/food')
96
+
97
+
98
+
99
+ form = FoodForm()
100
+
101
+ params = {
102
+
103
+ 'form': form,
104
+
105
+ }
106
+
107
+
108
+
109
+ return render(request, 'hello/food.html', params)
110
+
111
+ ```
112
+
113
+
114
+
115
+ そして、申し訳ありません、最初に回答させていただいたときに気づかなかったのですが、 `FoodForm` の方も少し変更していただく必要があります。ウィジェットに `CheckboxSelectMultiple` を使うのであれば、 `ChoiceField` だとバリデーション(つまり `form.is_valid()` )が通らなくなるので、代わりに `MultipleChoiceField` を使用してみてください。
116
+
117
+
118
+
119
+ ```python
120
+
121
+ # forms.py:
122
+
123
+ class FoodForm(forms.Form):
124
+
125
+ FOOD_CHOICES = [("りんご", "りんご"), ("バナナ", "バナナ"), ("シャケ", "シャケ")]
126
+
127
+
128
+
129
+ food = forms.MultipleChoiceField(
130
+
131
+ label='食べ物',
132
+
133
+ widget=forms.CheckboxSelectMultiple,
134
+
135
+ choices=FOOD_CHOICES,
136
+
137
+ required=True,
138
+
139
+ )
140
+
141
+ ```
142
+
143
+
144
+
145
+ これで私の手元では正しく動いたのですが、いかがでしょうか。ご参考になれば幸いです。