Django AttributeError: 'AddComments' object has no attribute 'user'
новичок в джанго, сижу только изучаю, пишу что-то вроде блога с комментариями и ответом на них, столкнулся в данный момент с проблемой AttributeError: 'AddComments' object has no attribute 'user'. Возможно кто-то сможет помочь исправить и объяснить в чем я ошибся, чтобы в дальнейшем не допускать оибок таких. Уже голову всю сломал.
news/models.py
from django.db import models
from django.utils import timezone
import time
from datetime import date, datetime
from django.urls import reverse
from django.contrib.auth.models import User
# Create your models here.
class Author(models.Model):
name = models.CharField("Имя", max_length=100)
nickname = models.CharField("Ник", max_length=30, null=True)
age = models.PositiveSmallIntegerField("Возраст", default=0)
image = models.ImageField("Изображение", upload_to="authors/")
#news = models.ManyToManyField(
# News, verbose_name="Новости автора", on_delete=models.CASCADE, null=True
#)
def __str__(self):
return self.name
class Meta:
verbose_name = "Автор"
verbose_name_plural = "Авторы"
class Category(models.Model):
name = models.CharField("Имя", max_length=150)
description = models.TextField("Описание")
url = models.SlugField(max_length=160, unique=True)
def __str__(self):
return self.name
class Meta:
verbose_name = "Категория"
verbose_name_plural = "Категории"
class News(models.Model):
title = models.CharField("Название новости", max_length=75)
text = models.TextField("Содержание")
image = models.ImageField("Изображение",upload_to="news_images/")
authors = models.ForeignKey(
User, verbose_name="автор", related_name="news_author", on_delete=models.CASCADE, null=True
)
categories = models.ForeignKey(
Category, verbose_name="категория", on_delete=models.SET_NULL, null=True
)
pub_date = models.DateField("Дата публикации", default=date.today)
pub_time = models.TimeField("Время публикации", default=time.strftime('%H:%M'))
url = models.SlugField(max_length=160, unique=True)
draft = models.BooleanField("Черновик", default=False)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse("news_detail", kwargs={"slug": self.url})
def get_comments(self):
return self.comments_set.filter(parent__isnull=True)
class Meta:
verbose_name = "Новость"
verbose_name_plural = "Новости"
class PhotosNews(models.Model):
title = models.CharField("Фотографии", max_length=100)
image = models.ImageField("Изображение",upload_to="news_photos/")
news = models.ForeignKey(News, verbose_name="Новость", on_delete=models.CASCADE)
def __str__(self):
return self.title
class Meta:
verbose_name = "Фотографии к новости"
verbose_name_plural = "Фотографии к новости"
class Comments(models.Model):
# email = models.EmailField()
# name = models.CharField("Имя", max_length=100)
text = models.TextField("Сообщение", max_length=1000)
user = models.ForeignKey(
User, verbose_name='пользователь', on_delete=models.CASCADE, blank=True, null=True
)
parent = models.ForeignKey(
'self', verbose_name="Родитель", on_delete=models.SET_NULL, blank=True, null=True
)
news = models.ForeignKey(News, verbose_name="новость", on_delete=models.CASCADE)
date = models.DateField("Дата публикации", default=date.today)
time = models.TimeField("Время публикации", default=time.strftime('%H:%M'))
def __str__(self):
return f"{self.user} - {self.news}"
class Meta:
verbose_name = "Комментарий"
verbose_name_plural = "Комментарии"
views.py
from django.shortcuts import render, redirect
from django.views.generic.base import View
from django.views.generic import DetailView, ListView
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required
from .models import *
from .forms import *
class UserView(ListView):
model = User
queryset = User.objects.all()
def username_view(self, request):
user = User.objects.get(username = request.POST['username'])
last_login = user.last_login
return last_login
class UserDetailView(DetailView):
model = User
slug_field = "username"
class BaseView(View):
def get(self, request, *args, **kwargs):
return render(request, 'base.html', {})
class NewsView(ListView):
model = News
queryset = News.objects.filter(draft=False)
class NewsDetailView(DetailView):
model = News
slug_field = "url"
class AddComments(View):
@login_required
def post(self, request, pk):
print(request.POST)
form = CommentsForm(request.POST)
news = News.objects.get(id=pk)
if form.is_valid():
form = form.save(commit=False)
form.user = request.user
form.save()
if request.POST.get('parent', None):
form.parent_id = int(request.POST.get('parent'))
form.news = news
form.save()
return redirect(news.get_absolute_url())
forms.py
from django import forms
from django.contrib.auth.models import User
from .models import *
class CommentsForm(forms.ModelForm):
class Meta:
model = Comments
fields = {'user', 'text'}
news_detail.html
{% extends 'news/base.html' %}
{% load static %}
{% block title %} {{ news.title }} {% endblock title %}
{% block content %}
<div class="news_title">
<h1>{{ news.title }}</h1>
</div>
<div class="news_image">
<img src="{{ news.image.url }}" class="img-fluid" alt="" width="854" height="480">
</div>
<div class="news_text">
<div>
<h3>{{ news.text }}</h3>
</div>
</div>
<div class="news_author">
<a href="{{ user.get_absolute_url }}">{{ user.username }} </a>
</div>
<div class="news_publishe_date">
{{ news.pub_date }}
</div>
<div class="contact-single">
<h3 class="editContent" style="outline: none; cursor: inherit;">
Оставить комментарий</h3><h6>{{ news.comments_set.count }} комментариев</h6>
{% if user.is_authenticated %}
<form action="{% url 'add_comments' news.id %}" method="post" class="mt-4" id="formComments">
{% csrf_token %}
<input type="hidden" name="parent" id="contactparent" value="">
<div class="form-group editContent">
<label for="contactcomment" class="editContent">
Ваш комментарий *
</label>
<textarea class="form-control border" rows="5" name="text"
id="contactcomment" required=""></textarea>
</div>
<div class="d-sm-flex">
<input type="hidden" class="commentId" name="user"
id="contactusername" value="">
</div>
<button type="submit" href="#formUsers"
class="mt-3 btn btn-success btn-block py-3" onclick="sendComments('{{ user.username }}')">
Отправить
</button>
</form>
{% endif %}
{% if user.is_anonymous %}
Для того, чтобы оставить комментарий, необходимо авторизоваться.
{% endif %}
</div>
<h3>Комментарии</h3>
<div class="wrap-comments">
<ul class="list-comments">
<li class="full-comment">
{% for comments in news.get_comments %}
<div class="comment" style="border: 1px solid grey; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; padding: 5px; margin-bottom: 10px;">
<img src="{% static 'images/L27JNotRkk8.png' %}" style="border-radius: 100%; width: 3%;">
<h5 id="formUsers"> {{ comments.user }} <font size="2"> {{ comments.date }} {{ comments.time }} </font> </h5>
<p>{{ comments.text }}</p>
<a href="#formComments" onclick="addComments('{{ comments.name }}', '{{ comments.id }}')">Ответить</a>
</div>
{% for comment in comments.comments_set.all %}
<img src="{% static 'images/answer-img.png' %}" style="width: 2%; position: relative; left: 5px;">
<div class="comment-answer" style="position: relative; left: 50px; border: 1px solid grey; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; padding: 5px; margin-bottom: 10px;">
<img src="{% static 'images/L27JNotRkk8.png' %}" style="border-radius: 100%; width: 2%;">
<h5>{{ comment.user }} <font size="2"> {{ comment.date }} {{ comment.time }} </font> </h5>
<p>{{ comment.text }}</p>
<a href="#formComments" onclick="addComments('{{ comments.name }}', '{{ comments.id }}')">Ответить</a>
</div>
{% endfor %}
{% endfor %}
</li>
</ul>
</div>
<script>
function addComments(name, id){
document.getElementById('contactparent').value = id;
document.getElementById('contactcomment').innerText = `${name}, `;
}
function sendComments(id){
document.getElementById('contactusername').value = id;
}
</script>
{% endblock content %}
Буду благодарен за помощь, уже всю голову сломал.