Установить автора по умолчанию для вошедшего в систему пользователя
Я уже пробовал 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 }} – {{ 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})