Я пытаюсь оставить комментарий к сообщению в Django, но моя форма никогда не действительна. Я обнаружил, что это потому, что мой request.method всегда GET, а не POST. Я хотел бы позволить пользователю добавить новый комментарий и автоматически сохранить его в базе данных и отобразить в подробном представлении моего сообщения.
views.py
def add_comment_to_post(request, pk):
print("REQUEST METHOD", request.method)
post = get_object_or_404(Post, pk=pk)
if request.method == "POST":
print("POST")
print(request.POST)
form = CommentForm(request.POST)
if form.is_valid():
print("HREE")
comment = form.save(commit=False)
comment.author = request.user
comment.date_posted = timezone.now()
comment.post = post
comment.save()
return redirect('post_detail', pk=comment.post.pk)
else:
print("ELSE")
form = CommentForm()
# Note the indentation (this code will be executed both if NOT POST
# and if form is not valid.
return render(request, 'main/add_comment_to_post.html', {'form': form, 'post':post})
forms.py
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = ['author', 'content']
models.py
class Comment(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
comment_id = models.AutoField(primary_key=True)
author = models.ForeignKey(Profile, on_delete=models.CASCADE)
content = models.TextField()
date_posted = models.DateTimeField(default=timezone.now)
# approved_comment = models.BooleanField(default=False)
def approve(self):
self.approved_comment = True
self.save()
class Meta:
ordering = ['date_posted']
def __str__(self):
return 'Comment {} by {}'.format(self.content, self.author.first_name)
class Post(models.Model):
run_id = models.AutoField(primary_key=True)
author = models.ForeignKey(Profile, on_delete=models.CASCADE)
title = models.TextField(max_length=100, blank=False, default="title holder.")
distance = models.FloatField(default=0.0, blank=False)
time = models.IntegerField(default=0, blank=False)
date_posted = models.DateTimeField(default=timezone.now)
location = models.TextField(max_length=100, blank=False, default="")
image = models.TextField(max_length=250, blank=True)
content = models.TextField(max_length=1000, blank=True, default="")
@property
def pace(self):
if self.distance == 0.0:
return 0.0
return round(self.time / self.distance, 2)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('post-detail', kwargs={'pk': self.pk})
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
urls.py
urlpatterns = [
# path('', views.home, name="main-home"),
path('', PostListView.as_view(), name="main-home"),
path('admin/', admin.site.urls),
path('register/', views.register, name="register"),
path('post/<int:pk>/', PostDetailView.as_view(), name='post-detail'),
path('post/new/', PostCreateView.as_view(), name='post-create'),
path('post/<int:pk>/update/', PostUpdateView.as_view(), name='post-update'),
path('post/<int:pk>/delete/', PostDeleteView.as_view(), name='post-delete'),
path('about/', views.about, name="main-about"),
path('search/', SearchResultsView.as_view(), name="main-search"),
path('post/<int:pk>/comment/', views.add_comment_to_post, name='add_comment_to_post'),
]
add_comment_to_post. html
{% extends "main/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
<h1>New comment</h1>
<form action="" method="POST">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">New Comment</legend>
{{ form|crispy }}
</fieldset>
<div class="form-group">
<a class="btn btn-outline-info" type="submit" href="{% url 'post-detail' pk=post.pk %}">Send</a>
</div>
</form>
{% endblock %}
Что Я пытался проверить, что это за запрос, и обработать его
искать другие похожие посты безрезультатно
изменить функцию представления
Любая помощь будет оценили.