Установить автора по умолчанию для вошедшего в систему пользователя

Я уже пробовал this, this и this безрезультатно. При отправке комментария я хочу, чтобы в поле "Автор" по умолчанию указывался текущий зарегистрированный пользователь. Я использую представления на основе классов и не нашел много вопросов и ответов, кроме попыток реализовать вышеописанное.

views.py

class CommentPost(SingleObjectMixin, FormView):
    model = Article
    form_class = CommentForm
    template_name = "article_detail.html"

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        return super().post(request, *args, **kwargs)

    def form_valid(self, form):
        comment = form.save(commit=False)
        form.instance.author = self.request.user
        comment.article = self.object
        comment.save()
        return super().form_valid(form)

    def get_success_url(self):
        article = self.get_object()
        return reverse("article_detail", kwargs={"pk": article.pk})

models.py

class Comment(models.Model):
    article = models.ForeignKey(Article, on_delete=models.CASCADE)
    comment = models.CharField(max_length=140)
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
    )

    def __str__(self):
        return self.comment

    def get_absolute_url(self):
        return reverse("article_list")

article_detail.html

  <!-- templates/article_detail.html -->
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block content %}
<body class="d-flex h-100">

<div class="container">
    <div class="col-8 mx-auto">
        <h3 class="pb-4 mb-4 fst-italic border-bottom">Article detail</h3>
        <div class="article-entry">
            <h2>{{object.title}}</h2>
            <p class="text-black-50 fst-italic">by {{object.author}} | {{object.date}}</p>
            <p>{{object.body}}</p>
        </div>
        {% if user.is_authenticated and user == article.author or user.is_superuser %}
        <p>
            <button class="btn">
                <a class="text-decoration-none text-white" href="{% url 'article_edit' article.pk %}">edit</a>
            </button>
            <button class="btn">
                <a class="text-decoration-none text-white" href="{% url 'article_delete' article.pk %}">delete</a>
            </button>
        </p>
        {% endif %}
        <br/>
        {% if article.comment_set.all %}
        <hr/>
        <h5>Comments</h5>
        {% for comment in article.comment_set.all %}
        <p>{{ comment.author }} &#8211; {{ comment }}</p>
        {% endfor %}
        {% endif %}
        <br/>
        <hr/>
        <h5>Add a comment</h5>
        <form action="" method="post"> {% csrf_token %}
            {{ form|crispy }}
            <button class="btn" type="submit">Save</button>
        </form>
        <br/>
        <p>Back to <a href="{% url 'article_list' %}">all articles</a></p>
    </div>
</div>
</body>
{% endblock content%}

forms.py

class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ("comment", "author")

Я попробовал изменить "автора" в полях на автора, как определено в модели комментариев.

Я пробовал использовать ' form.instance.author = self.request.user ', 'form.author = self.request.user' и ' comment.author = self.request.user' в файле views.py. Спасибо.

Попробуйте удалить функцию post, поскольку она не выполняет никакой необходимой работы, и убедитесь, что ваш подход к добавлению полей формы является последовательным.

model = Article
form_class = CommentForm
template_name = "article_detail.html"

def form_valid(self, form):
    form.instance.author = self.request.user
    form.instance.article = self.get_object()
    return super().form_valid(form)

def get_success_url(self):
    article = self.get_object()
    return reverse("article_detail", kwargs={"pk": article.pk})
Вернуться на верх