質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

0回答

630閲覧

【Django2】汎用クラスビューで表示している商品詳細ページにいいね機能を実装したいです。

nre

総合スコア35

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/09/02 02:45

編集2019/09/02 04:26

前提・実現したいこと

現在django2でアプリを開発しており、
汎用クラスビューのListViewでmodelsの情報を商品一覧ページに表示しています。
商品一覧ページはユーザーが会員登録して入力した情報で【ユーザー単位】で分けられております。
そして商品一覧ページに表示されている商品をクリックすると商品詳細ページになり、
その商品詳細ページにいいね機能を実装したいです。

※商品詳細はBootstrap4のモーダルで表示しております。

該当のソースコード

python

1#models.py 2 3class User(AbstractBaseUser, PermissionsMixin): 4 """カスタムユーザーモデル.""" 5 6 email = models.EmailField(_('email address'), unique=True) 7 first_name = models.CharField(_('名'), max_length=30, blank=True) 8 last_name = models.CharField(_('姓'), max_length=150, blank=True) 9 nick_name = models.CharField(_('ニックネーム'), max_length=30, blank=False) 10 11#views.py 12 13class AistView(generic.ListView): 14 model = User 15 template_name = 'register/top.html' 16 paginate_by = 8 17 queryset = User.objects.order_by('-created_at') 18 19#urls.py 20 21from django.urls import path 22from . import views 23 24app_name = 'register' 25 26urlpatterns = [ 27 path('', views.AistView.as_view(), name='top'), 28 path('<int:pk>/', views.DetailView.as_view(), name='datail_view'), 29 path('login/', views.Login.as_view(), name='login'), 30 path('logout/', views.Logout.as_view(), name='logout'), 31 path('user_create/', views.UserCreate.as_view(), name='user_create'), 32 path('user_create/done', views.UserCreateDone.as_view(), name='user_create_done'), 33 path('user_create/complete/<token>/', views.UserCreateComplete.as_view(), name='user_create_complete'), 34 path('user_detail/<int:pk>/', views.UserDetail.as_view(), name='user_detail'), 35 path('user_update/<int:pk>/', views.UserUpdate.as_view(), name='user_update'), 36 path('search/', views.ListView.as_view(), name='top'), 37 38]

html

1<div class="container-fluid"> 2 <div class="row"> 3 <div class="col-12" style="mx-auto"> 4 <p class="text-center"><span class="bg-white text-primary"></span></p> 5 </div> 6 {% for product in user_list %} 7 <div class="col-6 col-md-6"> 8 <div class="datail" data-toggle="modal" data-target="#{{ product.id }}"> 9 <div class="card mb-3" style="max-width: 500px;"> 10 <div class="row no-gutters"> 11 <div class="col-md-4"> 12 <div class="img-thumbnail"> 13 <img src="{{ product.top_image.url }}" class="aaa" width="100%" heught="100%"> 14 </div> 15 </div> 16 <div class="col-md-8"> 17 <div class="card-body"> 18 <p class="card-text">:{{ product.get_skill_display }}</p> 19 <p class="card-text">:{{ product.get_request_fee_display }}</p> 20 <p class="card-text">:{{ product.nick_name }}</p> 21 </div> 22 </div> 23 </div> 24 </div> 25 </div> 26 </div> 27 28 <!-- モーダルの設定 --> 29 <div class="modal fade" id="{{ product.id }}" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> 30 <div class="modal-dialog" role="document"> 31 <div class="modal-content"> 32 <div class="modal-header"> 33 <h5 class="modal-title" id="exampleModalLabel">「{{ product.nick_name }}」の詳細情報</h5> 34 <button type="button" class="close" data-dismiss="modal" aria-label="閉じる"> 35 <span aria-hidden="true">&times;</span> 36 </button> 37 </div> 38 <div class="modal-body"> 39 <div class="container"> 40 <div class="row"> 41 <div class="col"> 42 <img src="{{ product.top_image.url }}" class="img-thumbnail"> 43 </div> 44 <div class="col"> 45 <span class="nickname"> 46 {% if product.twitter %} 47 <a href="{{ product.twitter }}"><i class="fab fa-twitter fa-3x my-example fa-fw"></i></a> 48 {% endif %} 49 {% if product.instagram %} 50 <br> 51 <a href="{{ product.instagram }}" class="insta_btn"> 52 <span class="insta"> 53 <i class="fab fa-instagram fa-3x my-example fa-fw"></i></span>Follow Me</a> 54 </br> 55 {% endif %} 56 <p class='border-bottom'>■ニックネーム<br>{{ product.nick_name }}</br></p> 57 </span> 58 </div> 59 </div> 60 <div class="row"> 61 <div class="col"> 62 <p class='border-bottom'><br>{{ product.get_skill_display }}</br></p> 63 <p class='border-bottom'><br>{{ product.get_area_display }}</br></p> 64 <p class='border-bottom'><br>{{ product.get_request_fee_display }}</br></p> 65 {% if product.portfolio %} 66 <p><br>{{ product.portfolio | linebreaksbr }}</br></p> 67 {% endif %} 68 <p>PR<br>{{ product.self_introduction | linebreaksbr }}</br></p> 69 </div> 70 </div> 71 </div> 72 </div> 73 <div class="modal-footer"> 74 <a href="mailto:{{ product.email }}"> 75 <button type="submit" class="btn btn-outline-info my-2 my-sm-0">直接メールでお仕事の依頼をする</button> 76 </a> 77 <button type="button" class="btn btn-secondary" data-dismiss="modal">閉じる</button> 78 </div><!-- /.modal-footer --> 79 </div><!-- /.modal-content -->

試したこと

python

1#models.py 2class User(AbstractBaseUser, PermissionsMixin): 3 """カスタムユーザーモデル.""" 4 5 email = models.EmailField(_('email address'), unique=True) 6 first_name = models.CharField(_('名'), max_length=30, blank=True) 7 last_name = models.CharField(_('姓'), max_length=150, blank=True) 8 nick_name = models.CharField(_('ニックネーム'), max_length=30, blank=False) 9 like_num = models.IntegerField(default=0)#追加 10 11#views.py 12 13class AistView(generic.ListView): 14 model = User 15 template_name = 'register/top.html' 16 paginate_by = 8 17 queryset = User.objects.order_by('-created_at') 18 19 def like(request, pk): #追加← 20 try: 21 article = models.User.objects.get(pk=pk) 22 except models.User.DoesNotExist: 23 raise Http404 24 article.like += 1 25 article.save() 26 return redirect('register/top.html', pk) 27 28#urls.py 29urlpatterns = [ 30path("<int:pk>/like/",views.like.as_view(),name="like"), # 追記 31]

html

1<p><a href="{% url 'like_num' user.pk %}"><span id="like_num">{{ user.like_num }}</span>いいね!</a></p>

エラーコード

path("int:pk/like/",views.like.as_view(),name="like"), # 追記
AttributeError: module 'register.views' has no attribute 'like'

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2019/09/02 04:20

フリーランスを商品として扱っているようですが、このようなサイトで質問されるのに、もう少し気を使うことはできないものなのでしょうか。 like_numしか定義していないのに、article.like とlikeで参照するのは違和感があります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問