У меня есть представление create_post, через которое я пытаюсь добавить новый пост в блог, над которым работаю. Однако, когда я нажимаю «Отправить» после заполнения формы, которая включает пользователя (выпадающее меню всех зарегистрированных пользователей), заголовок и текст, я получаю сообщение с этим пользователем, которое уже существует. Как видно ниже, у post.user есть внешний ключ User. Не означает, что у одного поста может быть только один пользователь (автор), а у пользователя может быть много постов. Почему я не могу добавить еще один пост от того же пользователя?
Кроме того, как мне использовать встроенные компоненты Django для отображения сообщения, такого как «Публикация как {{user.username}}» или «Комментарий как {{user.username}}», если пользователь аутентифицирован.
Вместо того, чтобы записывать имя пользователя в текстовом поле при оставлении комментария, я хотел бы получить имя пользователя, если пользователь вошел в систему, и не просить пользователя писать имя пользователя в текстовом поле, поскольку я считаю, что это не имеет смысла. Я думаю, что мне может понадобиться использовать виджеты в forms.py и, возможно, использовать HiddenInputs()?
Прошу прощения, если нарушаю какие-либо правила сообщества, так как я недавно присоединился к этому сообществу и все еще пытаюсь разобраться в нормах и правилах.
модели.py
class Post(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
text = models.TextField()
published_date = models.DateTimeField(auto_now=True)
def summary(self):
"""Return a summary for very long posts to
get a glimpse from admin panel"""
return self.text[:100]
def pub_date_pretty(self):
return self.published_date.strftime('%b %e, %Y')
def __str__(self):
"""String representation"""
return self.title
def get_absolute_url(self):
"""Returns the url to access a detailed post"""
return reverse('post-detail', kwargs = {"pk": self.pk})
class Meta:
ordering = ['-published_date']
unique_together = ('user',)
формы.py
from django import forms
from .models import Post, Comment
class PostForm(forms.ModelForm):
class Meta():
model = Post
fields = ['user', 'title', 'text',]
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = ('user', 'text',)
просмотры.py
from django.shortcuts import render, redirect
from django.views.generic import TemplateView
from .models import Post, Comment
from django.utils import timezone
from django.views.generic import ListView, DetailView
from .forms import PostForm, CommentForm
from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404
@login_required
def create_post(request):
if request.method == 'POST':
post_form = PostForm(request.POST)
if post_form.is_valid():
post = post_form.save(request)
post.save()
else:
print(post_form.errors)
else:
post_form = PostForm()
context = {
'post_form': post_form,
}
return render(request, 'blog/addpost.html', context )
def add_comment_to_post(request, pk):
post = get_object_or_404(Post, pk=pk)
if request.method == 'POST':
form = CommentForm(request.POST)
if form.is_valid():
comment = form.save(commit=False)
comment.post = post
comment.save()
return redirect('post-detail', pk=pk)
else:
form = CommentForm()
return render(request, 'blog/add_comment_to_post.html', {'form': form,
})
В Post.Meta
вы определили ограничение unique_together только с пользователем. Это должно быть удалено
class Meta:
ordering = ['-published_date']
unique_together = ('user',) # This line here