現在Djangoで違反報告機能を作っています。
単純にボタンを押して違反報告を送信させることはできましたが、違反報告する前にカテゴリの選択をしたいのですが、フォームをどこに書き入れたらいいのかがわかりません。
違反報告ボタンは記事詳細ページ(class ItemDetailView
)に表示させたいです。
python
1#models.py 2#Item = 記事 3 4class Report(models.Model): 5 REPORT_CHOICES = [ 6 (1, '宣伝行為'), 7 (2, 'スパム'), 8 (3, '法律違反'), 9 (4, 'その他'), 10 ] 11 category = models.IntegerField(verbose_name="カテゴリ", choices=REPORT_CHOICES, default=1) 12 report_user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, null=True) 13 report = models.ForeignKey(Item, verbose_name='通報した記事', on_delete=models.PROTECT, blank=True) 14 report_at = models.DateTimeField(verbose_name='日付',auto_now_add=True) 15 text = models.CharField('備考欄', max_length=200) 16 17 class Meta: 18 verbose_name = _('レポート') 19 verbose_name_plural = _('レポート')
python
1#views.py 2class ItemDetailView(DetailView): 3 model = Item 4 def get_context_data(self, **kwargs): 5 context = super(ItemDetailView, self).get_context_data(**kwargs) 6 form = ReportForm() 7 context["form"] = form 8 return context 9 10def ReportPost(request, pk): 11 """報告""" 12 post = get_object_or_404(Item, pk=pk) 13 _report = Report() 14 _report.report = post 15 _report.report_user = User.objects.get(email=request.user.email) 16 _report.save() 17 return redirect('app:top') 18 19 20#urls.py 21 path('report/<int:pk>/', views.ReportPost, name='report'), 22
上記のコードのように報告ボタン(ReportPost
)と記事詳細ページ(ItemDetailView
)を書いてみたのですが、送信はされたのですが、変更しても値がデフォルトのままでした。
html
1報告ボタン 2<div class="popup_content"> 3 <label for="trigger" class="close_btn">×</label> 4 {%crispy form%} 5 <form action="{% url 'app:report' item.pk %}" method="post"> 6 <button class="btn btn-outline-success float-right" type="submit" name="button">報告</button> 7 {% csrf_token %} 8 </form> 9</div>
何かアドバイスをいただきたいです。
必要なコードがあれば追記いたしますのでよろしくお願いいたします。
#追記
forms.pyの追記させていただきました。
python
1forms.py 2 3class ReportForm(forms.ModelForm): 4 class Meta: 5 model = Report 6 fields = ('category', 'text',) 7 widgets = { 8 'text': forms.TextInput(attrs={'placeholder':'詳細な理由を記入してください(200文字以内)'}), 9 'category': forms.RadioSelect(), 10 }
回答1件
あなたの回答
tips
プレビュー