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

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

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

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Python 3.x

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

Q&A

解決済

1回答

1407閲覧

日記アプリでコメントしたユーザー名を表示したい

yanagswk

総合スコア2

Django

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Python 3.x

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

0グッド

0クリップ

投稿2020/06/20 06:30

前提・実現したいこと

python3.7とDjango2.2でログイン機能がある、日記のようなアプリを作成しているものです。
日記を作成したら、他のログインしているユーザーがコメントを出来るようにしており、フォーム画面からユーザー名とコメント内容を入力出来るようにしています。
しかしそれだと、ユーザー名を入力出来るようにしているため、自由にユーザー名を変更してコメント出来てしまいます。
なのでユーザー名の入力欄を無くし、コメントしたら自動的にコメントしたユーザー名を表示出来るようにしたいです。

該当のソースコード

  • comments.html

html

1{% for comment in journal.comments.all %} 2 {% if user.is_authenticated or comment.approved %} 3 <div class="comment"> 4 <strong>{{ comment.name }}</strong>・{{ comment.timestamp }} 5 <p>{{ comment.content|linebreaksbr }}</p> 6 <p> 7 <a href="{% url 'journal:reply_form' comment.pk %}">返信する</a> 8 {% if not comment.approved %} 9<a class="text-success" href="{% url 'journal:comment_approve' comment.pk %}">承認</a> 10<a class="text-danger" href="{% url 'journal:comment_remove' comment.pk %}">削除</a> 11 {% endif %} 12 </p> 13 </div> 14 {% endif %} 15{% endfor %}
  • views.py

python

1class CommentFormView(generic.CreateView): 2 model = Comment 3 form_class = JournalCommentForm 4 template_name = 'comment_form.html' 5 6 def form_valid(self, form): 7 comment = form.save(commit=False) 8 journal_pk = self.kwargs['pk'] 9 comment.journal = get_object_or_404(Journal, pk=journal_pk) 10 comment.save() 11 return redirect('journal:journal_detail', pk=journal_pk) 12 13 def get_context_data(self, **kwargs): 14 context = super().get_context_data(**kwargs) 15 journal_pk = self.kwargs['pk'] 16 context['journal'] = get_object_or_404(Journal, pk=journal_pk) 17 return context
  • models.py

python

1class Journal(models.Model): 2 user = models.ForeignKey(CustomUser, verbose_name='ユーザー', on_delete=models.PROTECT) 3 title = models.CharField(verbose_name='タイトル', max_length=40) 4 category = models.ForeignKey(Category, verbose_name='カテゴリー', on_delete=models.PROTECT) 5 tags = models.ManyToManyField(Tag, verbose_name='タグ(複数選択可)', blank=True) 6 content = models.TextField(verbose_name='本文', blank=True, null=True) 7 picture1 = models.ImageField(verbose_name='写真①', blank=True, null=True) 8 picture2 = models.ImageField(verbose_name='写真②', blank=True, null=True) 9 picture3 = models.ImageField(verbose_name='写真③', blank=True, null=True) 10 created_at = models.DateTimeField(verbose_name='作成日時', auto_now_add=True) 11 updated_at = models.DateTimeField(verbose_name='更新日時', auto_now=True) 12 relation = models.ManyToManyField('self', verbose_name='関連記事(複数選択可)', blank=True, null=True) 13 is_public = models.BooleanField(default=False) 14 15 class Meta: 16 verbose_name_plural = 'Journal' 17 18 def __str__(self): 19 return self.title 20 21 22class Comment(models.Model): 23 journal = models.ForeignKey(Journal, on_delete=models.CASCADE, related_name='comments') 24 name = models.CharField(max_length=50) 25 content = models.TextField(verbose_name='コメント', blank=True, null=True) 26 timestamp = models.DateTimeField(auto_now_add=True) 27 is_public = models.BooleanField(default=False) 28 approved = models.BooleanField(default=False) 29 30 class Meta: 31 ordering = ['-timestamp'] 32 33 def approve(self): 34 self.approved = True 35 self.save() 36 37 def __str__(self): 38 return self.content
  • form.py

python

1class JournalCommentForm(ModelForm): 2 class Meta: 3 model = Comment 4 fields = ('name', 'content') 5 widgets = { 6 'name': TextInput(attrs={ 7 'class': 'form-control', 8 'placeholder': '名前', 9 }), 10 'content': Textarea(attrs={ 11 'class': 'form-control', 12 'placeholder': 'コメント', 13 }), 14 } 15 labels = { 16 'author': '', 17 'text': '', 18 }
  • journal_detail.py

python

1{% extends 'base.html' %} 2{% load static %} 3{% block title %}日記詳細{% endblock %} 4{% block active_journal_list %}active{% endblock %} 5{% block contents %} 6 7<div class="container"> 8 <div class="div-style w-100"> 9 <div class="container"> 10 <div class="row"> 11 <main class="col-md-8"> 12 <div class="row"> 13 <div class="col-6"> 14 {{ object.user }}&emsp;ユーザー 15 <div class="detail_title">{{ object.title }}</div> 16 </div> 17 <div class="col-2"> 18 <div class="detail_size">カテゴリー</div> 19 <div class="category_style">{{ object.category.name }}</div> 20 </div> 21 <div class="col-4"> 22 <div class="detail_size">タグ</div> 23 {% for tag in object.tags.all %} 24 <div class="tag_style">{{ tag.name }}</div> 25 {% endfor %} 26 </div> 27 </div> 28 29 <p></p> 30 31 <div class="row"> 32 <div class="col-6"> 33 作成日時&emsp;&emsp;&emsp;{{ object.created_at }} 34 </div> 35 </div> 36 37 <div class="row"> 38 <div class="col-6"> 39 更新日時&emsp;&emsp;&emsp;{{ object.updated_at }} 40 </div> 41 {% if request.user.id == object.user.id %} 42 <div class='col-6 text-right'> 43 <a class="btn btn-success" href="{% url 'journal:journal_update' object.pk %}">編集</a> 44 <a class="btn btn-danger" href="{% url 'journal:journal_delete' object.pk %}">削除</a> 45 </div> 46 {% endif %} 47 </div> 48 49 <hr> 50 51 <div class="row"> 52 <div class="col-9"> 53 {{ object.content|linebreaksbr }} 54 </div> 55 </div> 56 57 <hr> 58 59 <div class="row"> 60 <div class="col-2"> 61 {% if object.picture1 %} 62 <strong>写真①</strong> 63 </div> 64 <div class="col-3"> 65 <img src="{{ object.picture1.url }}" width="200" height="200"/> 66 {% endif %} 67 </div> 68 </div> 69 70 <hr> 71 72 <div class="row"> 73 <div class="col-2"> 74 {% if object.picture2 %} 75 <strong>写真②</strong> 76 </div> 77 <div class="col-3"> 78 <img src="{{ object.picture2.url }}" width="200" height="200"/> 79 {% endif %} 80 </div> 81 </div> 82 83 <hr> 84 85 <div class="row"> 86 <div class="col-2"> 87 {% if object.picture3 %} 88 <strong>写真③</strong> 89 </div> 90 <div class="col-3"> 91 <img src="{{ object.picture3.url }}" width="200" height="200"/> 92 {% endif %} 93 </div> 94 </div> 95 96 <hr> 97 98 <article class="comment-area"> 99 <a class="btn btn-primary my-3" href="{% url 'journal:comment_form' journal.pk %}">コメントを投稿する</a> 100 {% include "journal/snippets/comments.html" %} 101 </article> 102 103 <hr> 104 105 </main> 106 <aside class="col-md-4"> 107 {% include "journal/snippets/sidebar.html" %} 108 </aside> 109 110 111 112 <h5>関連記事</h5> 113 <ul> 114 {% if journal.relation.all %} 115 {% for journal in journal.relation.all %} 116 <a href="{% url 'journal:journal_detail' journal.pk %}"><li>{{ journal.title }}</li></a> 117 {% endfor %} 118 {% else %} 119 <h6>関連記事がありません</h6> 120 {% endif %} 121 </ul> 122 </div> 123 </div> 124 </div> 125</div> 126{% endblock %} 127

試したこと

  • 1つめ

comments.htmlの
<strong>{{ comment.name }}</strong>・{{ comment.timestamp }}
の部分を、
<strong>{{ object.user }}</strong>・{{ comment.timestamp }}
にすると、日記を新規作成したときのユーザーになってしまいます。

  • 2つめ

comments.htmlの
<strong>{{ comment.name }}</strong>・{{ comment.timestamp }}
の部分を、
<strong>{{ user.get_username }}</strong>・{{ comment.timestamp }}
にすると、今現在ログインしているユーザーになり、ログインするたびにコメントしたユーザー名が変わってしまいます。  

コメントしたときのユーザー名を表示して、他のユーザーがログインしても、コメントしたときのユーザー名のままにしたいです。

よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

formからユーザー名の入力欄を無くすかわりに
formのnameにuser.get_usernameを突っ込めばいいのではないでしょうか
そうすればComment.nameにコメントを入力したユーザーが入ります。

投稿2020/06/26 05:43

tatamyiwathy

総合スコア1045

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問