Как правильно изменить код в файлах models.py, views.py и в шаблоне post_detail.html, чтобы комментарии, оставленные авторизованным пользователем, отображались на странице поста под его именем?
<br/><br/>
<b>models.py</b>
<br/><br/>
<pre><code class="python">from django.db import models
# Создайте свои модели здесь.
class Post(models.Model):
title = models.CharField('Заголовок записи', max_length=50)
description = models.TextField('Текст записи', max_length=5000)
date_add = models.DateTimeField('Дата публикации', auto_now=True)
def __str__(self):
return f'{self.date_add} / {self.title}'
class Comments(models.Model):
name = models.CharField('Имя', max_length=16) # Нужно изменить, чтобы имя авторизованного пользователя записывалось здесь
text_comments = models.TextField('Текст комментария', max_length=200)
post = models.ForeignKey(Post, verbose_name='Публикация', on_delete=models.CASCADE)
def __str__(self):
return f'{self.name} / {self.post}'</code></pre>
<br/><br/>
<b>views.py</b>
<br/><br/>
<pre><code class="python">class PostDetail(View):
def get(self, request, post_id):
post = Post.objects.get(id=post_id)
return render(request, 'forum/post_detail.html', {'post': post})
class AddComments(View):
def post(self, request, post_id):
form = CommentsForm(request.POST)
if form.is_valid():
# comment_name = request.user.username
# print(comment_name)
comment = form.save(commit=False)
comment.post_id = post_id
comment.save()
print(comment)
return redirect('post_detail', post_id=post_id)</code></pre>
Для реализации функциональности вывода комментариев под постом от имени авторизованного пользователя в Django, вам нужно внести изменения в модели, представления и шаблоны. Давайте шаг за шагом изменим ваши файлы.
### 1. Изменения в models.py
Чтобы сохранять имя авторизованного пользователя в комментариях, вам нужно изменить модель `Comments`. Вместо поля `name`, которое сейчас является `CharField`, вы должны использовать `ForeignKey`, чтобы связать комментарий с пользователем (пользователь будет ссылаться на модель `User`):
```python
from django.contrib.auth.models import User
class Comments(models.Model):
user = models.ForeignKey(User, verbose_name='Пользователь', on_delete=models.CASCADE) # Изменение на ForeignKey к User
text_comments = models.TextField('Текст комментария', max_length=200)
post = models.ForeignKey(Post, verbose_name='Публикация', on_delete=models.CASCADE)
def __str__(self):
return f'{self.user.username} / {self.post}'
```
### 2. Изменения в views.py
В представлении `AddComments` вам нужно изменить код, чтобы устанавливать пользователя комментария:
```python
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
@method_decorator(login_required, name='dispatch')
class AddComments(View):
def post(self, request, post_id):
form = CommentsForm(request.POST)
if form.is_valid():
comment = form.save(commit=False)
comment.user = request.user # Устанавливаем текущего пользователя
comment.post_id = post_id
comment.save()
return redirect('post_detail', post_id=post_id)
```
### 3. Изменения в посте detail шаблона post_detail.html
Теперь вам нужно отобразить комментарии, связанные с постом. Для этого вам нужно запросить комментарии в представлении `PostDetail` и передать их в шаблон:
```python
class PostDetail(View):
def get(self, request, post_id):
post = Post.objects.get(id=post_id)
comments = Comments.objects.filter(post=post) # Получаем комментарии для поста
return render(request, 'forum/post_detail.html', {'post': post, 'comments': comments})
```
Теперь в вашем шаблоне `post_detail.html` вы можете отобразить комментарии следующим образом:
```html
<h1>{{ post.title }}</h1>
<p>{{ post.description }}</p>
<h2>Комментарии:</h2>
<ul>
{% for comment in comments %}
<li>{{ comment.user.username }}: {{ comment.text_comments }}</li> <!-- Отображение имени пользователя и текста комментария -->
{% empty %}
<li>Комментариев нет.</li>
{% endfor %}
</ul>
<form method="post" action="{% url 'add_comment' post.id %}">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Оставить комментарий</button>
</form>
```
### 4. Не забудьте проверить настройки
Убедитесь, что у вас есть соответствующая форма (`CommentsForm`) и что у вас настроены URL для добаления комментариев.
Эти изменения позволят вам сохранять и отображать комментарии под постом от имени авторизованного пользователя.
Добавьте в комментарий внешний ключ к модели юзера с возможностью оставить его пустым (как и name)
При отрисовки формы ввода/сохранении коммента проверяйте, авторизирован ли пользователь. И в зависимости от этого выбирайте что записать.
В models.py username поменяйте наForeignKey
from django.contrib.auth.models import User class Comments(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='Пользователь') text_comments = models.TextField('Текст комментария', max_length=200) post = models.ForeignKey(Post, verbose_name='Публикация', on_delete=models.CASCADE) def __str__(self): return f'{self.user.username} / {self.post}'
В form.py исключите name
class CommentsForm(forms.ModelForm): class Meta: model = Comments fields = ('text_comments',)
В views.py добавьте поле user
class AddComments(View): def post(self, request, post_id): form = CommentsForm(request.POST) if form.is_valid(): comment = form.save(commit=False) comment.post_id = post_id comment.user = request.user comment.save() return redirect('post_detail', post_id=post_id)
В post_detail.html добавьте user.username
<div> <h3>Комментарии:</h3> <form action="{% url 'add_comments' post.id %}" method="post"> <h3></h3> {% csrf_token %} <div> <textarea name="text_comments" placeholder="Ваш комментарий..."></textarea> </div> <div><input type="submit"></div> </form> </div> <div> {% for comment in post.comments_set.all reversed %} <div class="view-comment"> <h4>{{ comment.user.username }}</h4> <p><i>{{ comment.text_comments }}</i></p> </div> {% endfor %} </div>
Должно работать
А что, если через models.ForeignKey(User) попробовать? Или проверять, авторизован ли пользователь и из объекта user как раз username и записывать?