簡體   English   中英

Django Post 的評論無法保存

[英]Comments on Django Post won't save

我正在嘗試對 Django 中的帖子發表評論,但我的表單永遠無效。 我發現這是因為我的 request.method 始終是 GET 而不是 POST。 我想允許用戶添加新評論並讓它自動保存到數據庫並顯示在我的帖子的詳細信息視圖中。

視圖.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})

表格.py

class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ['author', 'content']

模型.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()

網址.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 %}

我嘗試檢查它是什么類型的請求並處理它

搜索其他類似的帖子無濟於事

更改視圖功能

任何幫助,將不勝感激。

您沒有為 if form.is_valid(): 語句定義 else 狀態。 因此,如果您的表單有錯誤,請再次查看渲染您的模板。

        <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">替換該鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM