回答編集履歴

4

追記 2 を追加いたしました。

2018/12/19 04:59

投稿

gh640
gh640

スコア1407

test CHANGED
@@ -133,3 +133,111 @@
133
133
 
134
134
 
135
135
  とすると、 `question` が `__init__()` に正しく渡されているのかを `print()` の出力によって確認できると思うので、よろしければお試しになってみてください。
136
+
137
+
138
+
139
+ 追記 2:
140
+
141
+
142
+
143
+ すみません、変更すべき view は `DetailView` だったのですね。。。
144
+
145
+
146
+
147
+ 次のようにされるとよいものと思います。
148
+
149
+
150
+
151
+ URL パラメータを `DetailView.dispatch()` で取得して、それを `get_form_kwargs()` を使って `ChoiceCommentForm` に渡します。 `ChoiceCommentForm` の方では `__init__()` でそれを受け取って `choice` フィールドの queryset の絞り込みに使います。
152
+
153
+
154
+
155
+ おおよそ次のとおりに書くことで絞り込みがうまくできることを私の環境で確認していますが、細かいところは私がミスしている可能性がありますのであくまでも参考に(まるっぽコピペではなく)お試しになってみてください。
156
+
157
+
158
+
159
+ `views.py`:
160
+
161
+
162
+
163
+ ```python
164
+
165
+ class DetailView(ModelFormMixin, generic.DetailView):
166
+
167
+ model = Question
168
+
169
+ template_name = 'polls/detail.html'
170
+
171
+ form_class = ChoiceCommentForm
172
+
173
+
174
+
175
+ def get_queryset(self):
176
+
177
+ return Question.objects.filter(pub_date__lte=timezone.now())
178
+
179
+
180
+
181
+ def dispatch(self, request, *args, **kwargs):
182
+
183
+ self.target_question = get_object_or_404(Question, pk=kwargs['pk'])
184
+
185
+ return super().dispatch(request, *args, **kwargs)
186
+
187
+
188
+
189
+ def get_form_kwargs(self):
190
+
191
+ kwargs = super().get_form_kwargs()
192
+
193
+ kwargs['target_question'] = self.target_question
194
+
195
+ return kwargs
196
+
197
+ ```
198
+
199
+
200
+
201
+ `forms.py`:
202
+
203
+
204
+
205
+ ```python
206
+
207
+ class ChoiceCommentForm(forms.ModelForm):
208
+
209
+ choice = forms.ModelChoiceField(
210
+
211
+ queryset=Choice.objects.all(), widget=forms.RadioSelect
212
+
213
+ )
214
+
215
+
216
+
217
+ class Meta:
218
+
219
+ model = Choice_Comment
220
+
221
+ fields = "__all__"
222
+
223
+
224
+
225
+ def __init__(self, *args, **kwargs):
226
+
227
+ question = kwargs.pop('target_question', None)
228
+
229
+ super().__init__(*args, **kwargs)
230
+
231
+
232
+
233
+ # choice の選択肢を question に関係したものに絞り込む
234
+
235
+ if question:
236
+
237
+ self.fields['choice'].queryset = Choice.objects.filter(question=question)
238
+
239
+ ```
240
+
241
+
242
+
243
+ お手伝いするつもりがかえって遠回りをさせる形になってしまいました。ご容赦ください >_<

3

文書の一部が抜けていたのを修正しました。

2018/12/19 04:59

投稿

gh640
gh640

スコア1407

test CHANGED
@@ -132,4 +132,4 @@
132
132
 
133
133
 
134
134
 
135
- `question` が `__init__()` に正しく渡されているのかを `print()` の出力によって確認できると思うので、よろしければお試しになってみてください。
135
+ とすると、 `question` が `__init__()` に正しく渡されているのかを `print()` の出力によって確認できると思うので、よろしければお試しになってみてください。

2

追記 1 を追加しました。

2018/12/18 04:54

投稿

gh640
gh640

スコア1407

test CHANGED
@@ -93,3 +93,43 @@
93
93
 
94
94
 
95
95
  - [Django ModelChoiceField: filtering query set and setting default value as an object - Stack Overflow](https://stackoverflow.com/questions/5329586/django-modelchoicefield-filtering-query-set-and-setting-default-value-as-an-obj)
96
+
97
+
98
+
99
+ 追記 1:
100
+
101
+
102
+
103
+ コメントとお試しいただきありがとうございます。すみません、いくつか間違いがありましたね。お手伝いするつもりが余計なお手間をかけてしまいました。。
104
+
105
+
106
+
107
+ 例えば、
108
+
109
+
110
+
111
+ ```python
112
+
113
+ def __init__(self, *args, **kwargs):
114
+
115
+ question = kwargs.pop('question', None)
116
+
117
+ print(question)
118
+
119
+ super().__init__(*args, **kwargs)
120
+
121
+
122
+
123
+ # choice の選択肢を question に関係したものに絞り込む
124
+
125
+ if question:
126
+
127
+ print('here')
128
+
129
+ self.fields['choice'].queryset = Choice.objects.filter(question=question),
130
+
131
+ ```
132
+
133
+
134
+
135
+ `question` が `__init__()` に正しく渡されているのかを `print()` の出力によって確認できると思うので、よろしければお試しになってみてください。

1

タイポを 1 点修正しました。

2018/12/18 04:53

投稿

gh640
gh640

スコア1407

test CHANGED
@@ -32,7 +32,7 @@
32
32
 
33
33
  def __init__(self, *args, **kwargs):
34
34
 
35
- qustion = kwargs.pop('question', None)
35
+ question = kwargs.pop('question', None)
36
36
 
37
37
  super().__init__(*args, **kwargs)
38
38