前提・実現したいこと
udemyでDjangoの使い方を学び、新たに1からつくってみようと質問投稿サイトを作っています。
現在、UserのGroup限定で表示できるようにViewやFormを編集しました。
リストに表示する際に、ログインしているユーザーがそのグループに属さない場合には、表示しないようにしたいです。
発生している問題・エラーメッセージ
ViewやFormでUserのGroupのみformに表示されるようにしましたが、いざ送信するとエラーが出てしまいます。
今日一日中考えていましたが、解決しなかったので質問します。
~~~スタックトレース~~~
Internal Server Error: /question/create/
Traceback (most recent call last):
File "C:\Users\tensaiTVkun\Anaconda3\envs\mysite\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "C:\Users\tensaiTVkun\Anaconda3\envs\mysite\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:\Users\tensaiTVkun\Anaconda3\envs\mysite\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\tensaiTVkun\Anaconda3\envs\mysite\lib\site-packages\django\views\generic\base.py", line 71, in view
return self.dispatch(request, *args, **kwargs)
File "C:\Users\tensaiTVkun\Anaconda3\envs\mysite\lib\site-packages\django\contrib\auth\mixins.py", line 52, in dispatch
return super().dispatch(request, *args, **kwargs)
File "C:\Users\tensaiTVkun\Anaconda3\envs\mysite\lib\site-packages\django\views\generic\base.py", line 97, in dispatch
return handler(request, *args, **kwargs)
File "C:\Users\tensaiTVkun\Documents\majiranger\majiblue\views.py", line 250, in post
form = self.form_class(request.POST)
File "C:\Users\tensaiTVkun\Documents\majiranger\majiblue\forms.py", line 86, in init
self.fields['share_group'].queryset = group_ids
File "C:\Users\tensaiTVkun\Anaconda3\envs\mysite\lib\site-packages\django\forms\models.py", line 1206, in _set_queryset
self._queryset = None if queryset is None else queryset.all()
AttributeError: 'QueryDict' object has no attribute 'all'
該当のソースコード
Python
1views.py 2class QuestionCreateView(LoginRequiredMixin, CreateView): 3 model = Question 4 form_class = QuestionForm 5 success_url = reverse_lazy("question_index") 6 login_url = '/login/' 7 template_name = 'qasite/question_form.html' 8 initial = {'key': 'value'} 9 10 def get(self, request, *args, **kwargs): 11 #ユーザーのグループをformに渡す 12 form_class = self.get_form_class() 13 group_ids = self.request.user.groups.all() 14 form = form_class(group_ids=group_ids) 15 params = { 16 'form':form, 17 } 18 return render(request, self.template_name, params) 19 20 def post(self, request, *args, **kwargs): 21 form = self.form_class(request.POST) 22 23 question = Question 24 question.owner = request.user 25 question.save() 26 27 if form.is_valid(): 28 messages.success(self.request, "保存しました") 29 return redirect(to=reverse_lazy("qasite:question_index")) 30 else: 31 messages.success(self.request, "保存に失敗しました") 32 return redirect(to=reverse_lazy("qasite:question_index")) 33 34 return render(request, self.template_name, params)
Python
1models.py 2class Question(models.Model): 3 title = models.CharField(max_length=140, verbose_name='件名') 4 question = models.TextField(verbose_name='質問内容') 5 owner = models.ForeignKey(User, on_delete=models.PROTECT, verbose_name='投稿者') 6 category = models.IntegerField(choices=q_category, verbose_name='カテゴリー') 7 posted_date = models.DateTimeField(auto_now_add=True, verbose_name='投稿時間') 8 update_date = models.DateTimeField(auto_now=True, verbose_name='更新時間') 9 share_group = models.ForeignKey(Group, on_delete=models.CASCADE, verbose_name='投稿先グループ', null=True, blank=True) 10 is_answered = models.BooleanField(verbose_name='回答済み', default=False) 11 is_public = models.BooleanField(verbose_name='公開', default=True) 12 image = models.ImageField(upload_to='images/', verbose_name='画像', blank=True, null=True) 13 14 def __str__(self): 15 return self.title
Python
1forms.py 2class QuestionForm(forms.ModelForm): 3 class Meta: 4 model = Question 5 fields = ["title", "category", "question", "image", "share_group", ] 6 7 def __init__(self, group_ids, *args, **kwargs): 8 #viewsからユーザーのグループを受け取り、groupにセットする 9 super(QuestionForm, self).__init__(*args, **kwargs) 10 print(group_ids) 11 self.fields['share_group'].queryset = group_ids
試したこと
views.pyのpostの部分に
form_class = self.get_form_class()
group_ids = self.request.user.groups.all()
form = form_class(group_ids=group_ids)
が必要かと思い追加しましたが、グループが保存されませんでした。
あなたの回答
tips
プレビュー