前提・実現したいこと
ボタンを押すと数値が増えるカウンターボタンを投稿されたコメントに紐づけたいです。
投稿ページを別に作ってそこに遷移させればもっと簡単だとは思うのですが、今回は1つのページ内で行いたいと思っています。
該当のソースコード
ここに投稿フォームの表示。投稿されたコメントの表示。いいねボタンの設置の3つを1ページで実現しようとしています。
board.html
html
1#ここがコメントの投稿フォームです 2<form action="" method="POST" enctype="multipart/form-data"> 3{{ form.as_p }} 4<button type="submit">送信</button> 5{% csrf_token %} 6</form> 7 8#ここがコメントの表示部分です 9{% for post in post_list %} 10 11<p>{{ post.name }}</p> 12<p>{{ post.text | linebreaksbr }}</p> 13{% if post.file %} 14<p><img src="{{ post.file.url }}" ></p> 15{% endif %} 16 17<p>{{ post.date }}</p> 18 19#ここにいいねボタンを設置。postのidと紐つけていいねボタンを押すとカウントが増えていく 20<h3>"いいね"ボタンを押してください</h3> 21<form action="{% url 'board:good' question.id %}" method="post"> 22 {% csrf_token %} 23 <input type="submit" name="good" value="いいね">({{ good_count }} いいね) 24</form> 25 26 27 28{% endfor %} 29
関数でgoodを機能させるURLであるgood/int:pkを設置しています。
urls.py
python
1 2 3 #!/usr/bin/env python 4# -*- coding: utf-8 -*- 5 6from django.urls import path 7 8from . import views 9 10app_name = 'board' 11urlpatterns = [ 12 path('', views.FormAndListView.as_view(), name='board'), 13 path('good/<int:pk>/', views.good, name='good'), 14] 15 16 17 18
class Goodはclass Postに紐つけています。
models.py
from django.db import models from django.utils import timezone class Post(models.Model): class Meta: verbose_name = '投稿' verbose_name_plural = '投稿リスト' name = models.CharField('名前', max_length=20) text = models.TextField('本文') date = models.DateTimeField('日付', default=timezone.now) file = models.FileField('ファイル', blank=True, null=True) def __str__(self): return self.text class Good(models.Model): """いいね.""" created_at = models.DateTimeField(default=timezone.now) good = models.ForeignKey(Post, on_delete=models.CASCADE, null=True) class Meta: db_table = 'good' verbose_name = verbose_name_plural = 'いいね'
フォームと投稿されたコメントといいねボタンの表示。
class FormAndListView(FormView, ListView, TemplateResponseMixin): def get(self, request, *args, **kwargs): formset = PostForm(request.POST or None, files=request.FILES or None) formView = FormView.get(self, request, *args, **kwargs) listView = ListView.get(self, request, *args, **kwargs) formData = formView.context_data['form'] listData = listView.context_data['object_list'] good_count = Good.objects.count() context = {'form' : formData, 'post_list' : listData, 'good_count' : good_count} return render(request, 'board/board.html', context)
いいねボタンをクリックすると数値が増える。
def good(request, pk): """いいねボタンをクリック.""" pk = get_object_or_404(Post, pk=pk) if request.method == 'POST': # データの新規追加 Good.objects.create(pk=request.POST['good']) context = {'pk' : pk} return redirect('board:board')
###エラーメッセージ
django.urls.exceptions.NoReverseMatch: Reverse for 'good' with arguments '('',)' not found. 1 pattern(s) tried: ['board/good/(?P<pk>[0-9]+)/$']
pk関連のコードを削除した場合いいねボタンで数値が増加することは確認しております。ただしその場合コメントへの紐づけが行われません。
試したこと
現在はurlからプライマリーキーを紐つけるコードの書き方なのでこのままでは実現が難しいことは理解しているのですが・・・。
urlに情報が無い状態でPostのプライマリーキーを特定して紐つけることがdjangoで果たしてかのうなのでしょうか。
補足情報(FW/ツールのバージョンなど)
python=3.7.0
django=(2, 0, 2, 'final', 0)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/26 07:24 編集
2019/01/26 13:25
2019/01/27 09:55 編集