Как реализовать правильно комментарии в блоге на 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 шт):

Автор решения: Vladislav Pavkin

Брать 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'}),
         }
→ Ссылка