Как реализовать правильно комментарии в блоге на Django?
Делаю блог на Django, пытаюсь добавить форму комментариев, но автор (зарегистрированный пользователь) не вносится автоматически. Поле скрыто, но оно остается просто пустым. Гуглила информацию по этому вопросу, но проблема остается.
PS: Я новичок, поэтому заранее прошу понять, если написала вопрос не в полной мере или что-то не то в коде. Спасибо
models.py
class Comment(models.Model):
post = models.ForeignKey(Post, related_name='comments', on_delete=models.CASCADE)
author = models.ForeignKey(Profile, null=True, on_delete=models.CASCADE)
name = models.CharField(max_length=255)
body = models.TextField(max_length=255)
date_added = models.DateTimeField(auto_now_add=True)
def __str__(self):
return '%s - %s' % (self.post.title, self) + ' | ' + str(self.author)
forms.py
class CommentForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['author'].disabled = True
class Meta:
model = Comment
fields = ('name', 'body', 'author')
widgets = {
'author': forms.TextInput(attrs={'class': 'formControl', 'value': '', 'id': 'elder', 'type': 'hidden'}),
'name': forms.TextInput(attrs={'class': 'formControl', 'placeholder': 'Write your comment here'}),
'body': forms.Textarea(attrs={'class': 'formControl'}),
}
views.py
class AddCommentView(CreateView):
model = Comment
form_class = CommentForm
template_name = 'add_comment.html'
success_url = reverse_lazy('home')
def form_valid(self, form):
form.instance.post_id = self.kwargs['pk']
return super().form_valid(form)
Ответы (2 шт):
Брать user_id из формы нельзя. В таком случае, любой пользователь сможет в консоли браузера поменять значение в input-е и отправить комментарий от чужого имени.
Вам нужно взять автора из request. А из формы author вообще убрать.
class AddCommentView(CreateView):
model = Comment
form_class = CommentForm
template_name = 'add_comment.html'
success_url = reverse_lazy('home')
def form_valid(self, form):
form.instance.post_id = self.request.user.profile
return super().form_valid(form)
Решила следующим способом(может кому-то пригодится):
views.py
class AddCommentView(CreateView):
model = Comment
form_class = CommentForm
template_name = 'add_comment.html'
success_url = reverse_lazy('home')
def form_valid(self, form):
form.instance.user = self.request.user
return super().form_valid(form)
def get(self, request, *args, **kwargs):
form = CommentForm(initial={'author': request.user, 'post': kwargs['pk']})
context = {'form': form}
return render(request, 'add_comment.html', context)
models.py
class Comment(models.Model):
post = models.ForeignKey(Post, related_name='comments', on_delete=models.CASCADE)
author = models.ForeignKey(User, null=True, on_delete=models.CASCADE)
name = models.CharField(max_length=255)
body = models.TextField(max_length=255)
date_added = models.DateTimeField(auto_now_add=True)
def __str__(self):
return '%s - %s' % (self.post.title, self) + ' | ' + str(self.author)
forms.py
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = ('name', 'body', 'author', 'post')
widgets = {
'author': forms.HiddenInput(),
'post': forms.HiddenInput(),
'name': forms.TextInput(attrs={'class': 'formControl', 'placeholder': 'Write your comment here'}),
'body': forms.Textarea(attrs={'class': 'formControl'}),
}
