Не отражает текущего пользователя в комментарии
Здравствуйте, я новичок в сообществе и в мире программирования, поэтому я надеюсь, что вы можете извинить мое невежество.
Я создаю приложение в стиле Instagram с помощью Django 3.2.5. Где у пользователей есть профили, которые они могут посещать и загружать фотографии. Я реализую систему комментирования, я почти закончил ее или так я думаю ... Оказывается, я застрял ...
При генерации комментария пользователем с зарегистрированным профилем, комментарий отображается как анонимный.
Я исследовал и оказалось, что в модели комментария я сделал связь с пользователем и профилем, указав параметр null как true. При удалении этого параметра и повторной отправке комментария к посту я получаю ошибку 'Not Null Constraint Failed' для profile_id и для user_id
(На изображении показаны первые комментарии, сделанные из админки. И последний с параметром null = true в модели)
Здесь я оставляю свой models.py
class Comment(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
user = models.ForeignKey(User, on_delete=models.CASCADE)
profile = models.ForeignKey(Profile, on_delete=models.CASCADE)
text = models.TextField(max_length=200)
created_date = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ['created_date']
def __str__(self):
return self.text
Здесь я оставляю свой views.py
def create_comment(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('posts:feed')
else:
form = CommentForm()
return render(request, 'posts/feed.html', {
'form': form,
})
Вот мой urls.py
urlpatterns = [
path(r'^post/(?P<pk>[0-9]+)/comment/$', create_comment, name='create'),]
Вот мой forms.py
class CommentForm(forms.ModelForm):
pass
class Meta:
model = Comment
fields = ['text']
Вот мой html
<form action="{% url 'comments:create' pk=post.pk %}" method="POST" >
{% csrf_token %}
<div class="input-group">
<input type="text" class="form-control" placeholder="Comment here" aria-label="text" name="text" value="{{ post.comment.pk}}" >
<div class="input-group-append">
<button class="btn btn-dark" type="submit" id="button-addon2"><i class="fas fa-comment"></i></button>
</div>
</div>
</form>
Заранее большое спасибо!
Вы должны связать атрибут .user
с вошедшим пользователем, так:
from django.contrib.auth.decorators import login_required
@login_required
def create_comment(request, pk):
if request.method == 'POST':
form = CommentForm(request.POST, request.FILES)
if form.is_valid():
form.instance.post_id = pk
form.instance.user = request.user
form.save()
return redirect('posts:feed')
else:
form = CommentForm()
return render(request, 'posts/feed.html', {'form': form})
Используя .post_id = pk
, мы больше не запрашиваем базу данных для получения первой должности, проверка выполняется при создании экземпляра Comment
.
Примечание: Обычно лучше использовать
settings.AUTH_USER_MODEL
[Django-doc] для ссылки на модель пользователя, чем использоватьUser
модель [Django-doc] напрямую. Для получения дополнительной информации вы можете посмотреть ссылка наUser
модель раздел документации .
Примечание: Вы можете ограничить представления для аутентифицированных пользователей с помощью декоратора
@login_required
декоратора [Django-doc].