Комментарии на Django Сообщение не будет сохранено - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь оставить комментарий к сообщению в 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 %}

Что Я пытался проверить, что это за запрос, и обработать его

искать другие похожие посты безрезультатно

изменить функцию представления

Любая помощь будет оценили.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020
        <div class="form-group">
            <a class="btn btn-outline-info" type="submit" href="{% url 'post-detail' pk=post.pk %}">Send</a>
        </div>

Ваша проблема в том, что это ссылка, а не форма отправки. Попробуйте заменить эту ссылку простой <input type="submit" value="Send">.

0 голосов
/ 26 февраля 2020

Вы не определили другое состояние для оператора if form.is_valid ():. Поэтому, если в вашей форме есть ошибки, просмотрите рендеринг вашего шаблона снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...