Задать вопрос

Как выводить комментарии под постом от имени авторизованного пользователя в django?

В проекте использую стандартную модель пользователя: django.contrib.auth.models.User, после авторизации пишу комментарий под постом и после нажатия на кнопку отправить ничего не происходит, комментарий не выкладывается и в админ панели не появляется, до удаления строки <input name="name" placeholder="Ваш имя..."> из файла post_detail.html все работало кроме имени, имя на странице указывалось авторизованного пользователя, а в админ панели показывало введенное на странице в input. Как сделать так что бы всё заработало?

models.py

from django.db import models


# Create your models here.
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}'


views.py

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)


post_detail.html

<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>{{ user.username }}</h4>
        <p><i>{{ comment.text_comments }}</i></p>
    </div>
    {% endfor %}
    </div>


form.py

from django import forms
from .models import Comments



class CommentsForm(forms.ModelForm):
    class Meta:
        model = Comments
        fields = ('name', 'text_comments')
  • Вопрос задан
  • 149 просмотров
Подписаться 1 Простой 3 комментария
Решения вопроса 1
Lord_of_Rings
@Lord_of_Rings
Дунадан - северный странник. Злой, но очень добрый
В 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>

Должно работать
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
AlexNest
@AlexNest Куратор тега Python
Работаю с Python/Django
Добавьте в комментарий внешний ключ к модели юзера с возможностью оставить его пустым (как и name)
При отрисовки формы ввода/сохранении коммента проверяйте, авторизирован ли пользователь. И в зависимости от этого выбирайте что записать.
Ответ написан
@alekssamos
Программист любитель
А что, если через models.ForeignKey(User) попробовать? Или проверять, авторизован ли пользователь и из объекта user как раз username и записывать?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы