Не могу связать новость и комментарий
Выводится ошибка:
ValueError: Cannot assign "<django.db.models.query_utils.DeferredAttribute object at 0x0307E628>": "Comment.news" must be a "News" instance.
она жалуется на form.news = news_filter
Но почему она жалуется я не понимаю. P.s.Я новичек
models.py
class Comment(models.Model):
news = models.ForeignKey(News, verbose_name='новость', on_delete=models.CASCADE)
author = models.ForeignKey(User, verbose_name='Автор', on_delete=models.CASCADE, default=True)
email = models.EmailField(verbose_name='Почта')
text = models.TextField(verbose_name='Комментарий')
file = models.FileField(verbose_name='Файл для загрузки', upload_to='comments', blank=True)
date = models.DateField(auto_now_add=True)
def __str__(self):
return f'Имя пользователя: {self.author.first_name} {self.author.last_name} | Почта: {self.email} ' \
f'| Имя пользователя: {self.author.username}'
class Meta:
verbose_name = 'комментарий'
verbose_name_plural = 'комментарии'
forms.py
class CommentForm(ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for name, item in self.fields.items():
item.widget.attrs['class'] = f'form-control {name} mb-1 mt-1'
class Meta:
model = Comment
fields = ('text', 'file')
views.py
def news_page(request, pk):
news_filter = News.objects.filter(id=pk)
comments = Comment.objects.filter(news=pk)
if request.method == 'POST':
form = CommentForm(request.POST)
if form.is_valid():
form = form.save(commit=False)
form.author = request.user
form.news = news_filter
form.save()
return HttpResponseRedirect(request.path_info)
else:
form = CommentForm()
context = {
'title': 'Новости',
'news': news_filter,
'form': form,
'comments': comments,
}
return render(request, 'mainapp/news.html', context)
Ответы (1 шт):
Автор решения: Andrey Maslov
→ Ссылка
у тебя в коде идет
news_filter = News.objects.filter(id=pk)
в данном случае у тебя в news_filter хранится queryset (в котором находится одна новость), а в форме у тебя требуется один объект News
ты можешь исправить это следующим образом добавив .first() или заменив .filter на .get
т.е.
news_filter = News.objects.filter(id=pk).first()
или
news_filter = News.objects.get(id=pk)