前提・実現したいこと
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 }} ユーザー 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 作成日時   {{ object.created_at }} 34 </div> 35 </div> 36 37 <div class="row"> 38 <div class="col-6"> 39 更新日時   {{ 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 }}
にすると、今現在ログインしているユーザーになり、ログインするたびにコメントしたユーザー名が変わってしまいます。
コメントしたときのユーザー名を表示して、他のユーザーがログインしても、コメントしたときのユーザー名のままにしたいです。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。