Python django can';不要向数据库提交评论

Python django can';不要向数据库提交评论,python,django,database,Python,Django,Database,我试图在我的django应用程序中添加一个注释功能,但无论我做了什么,提交的注释都不会显示在数据库中,我不知道为什么。这是我使用过的一些代码,请看一下 模型是一部分 class Comment(models.Model): name = models.CharField(max_length=80) email = models.EmailField() text = models.TextField() post = models.ForeignKey(Post

我试图在我的django应用程序中添加一个注释功能,但无论我做了什么,提交的注释都不会显示在数据库中,我不知道为什么。这是我使用过的一些代码,请看一下

模型是一部分

class Comment(models.Model):
    name = models.CharField(max_length=80)
    email = models.EmailField()
    text = models.TextField()
    post = models.ForeignKey(Post, related_name='comments')
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    active = models.BooleanField(default=True)

    class Meta:
        ordering = ('created',)
        verbose_name="评论"
        verbose_name_plural="评论"

    def __str__(self):
        return 'Comment by {} on {}'.format(self.name, self.post)

forms.py部分

from django import forms
from .models import Comment

class CommentForm(forms.ModelForm):
    class Meta:
        model=Comment
        fields=('name','email','text')

views.py部分

def post_comment(request,id):

post=get_object_or_404(Post,id=id)

if request.method=='POST':
    form=CommentForm(request.POST)
    if form.is_valid():
        name=request.POST.get('name','')
        email=request.POST.get('email','')
        text=request.POST.get('text','')
        comment=Comment(name=name,email=email,text=text,post=14)
        comment.save()
        return redirect(post)
    else:
        form=CommentForm()
        comment_list = post.comments.all()
        context={
        'post':post,
        'form':form,
        'comment_list':comment_list
        }
    return render(request,'post_detail.html',context=context)
return redirect(post)

还有post_detail.html部分

<form action="" method="POST" class="mb-5">{% csrf_token %}
<div class="form-group">
<label for="exampleInputPassword1">名称</label>
<input name="name" type="name" class="form-control" id="exampleInputPassword1" placeholder="Name">
</div>
  <div class="form-group">
    <label for="exampleInputEmail1">邮箱</label>
    <input name="email" type="email" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" placeholder="Enter email">
    <small id="emailHelp" class="form-text text-muted">We'll never share your email with anyone else.</small>
  </div>
  <div class="form-group">
    <label for="exampleFormControlTextarea1">评论</label>
    <textarea name="text" class="form-control" id="exampleFormControlTextarea1" placeholder="Comment area..." rows="5"></textarea>
  </div>
    <button type="submit" class="btn btn-primary" value="post_comment">提交</button>
    </form>
{%csrf\u令牌%}
名称
邮箱
我们永远不会与其他人共享您的电子邮件。
评论
提交

有什么建议吗?谢谢。

你在这里做错了两件事。首先,您是手动呈现表单,并且HTML中没有任何内容可以显示表单错误。您需要将错误添加到HTML中,如-或中所述,直到您使用
{{form.as_p}}

即使在那之后,它仍然无法工作,因为视图中的python代码是错误的

if form.is_valid():
    name=request.POST.get('name','')
    email=request.POST.get('email','')
    text=request.POST.get('text','')
    comment=Comment(name=name,email=email,text=text,post=14)
    comment.save()
    return redirect(post)
else:
    form=CommentForm()
上面最后两行代码导致在表单无效时创建一个新表单。将丢弃已发布的任何表单数据。这也意味着你所犯的任何错误都将被丢弃。正确的代码如下所示:

post=get_object_or_404(Post,id=id)
if request.method=='POST':
    form=CommentForm(request.POST)
    if form.is_valid():
        # don't directly use the request post data. Always use form.cleaned_data        
        name= form.cleaned_data['name'
        .....

        comment=Comment(name=name,email=email,text=text,post=14)
        comment.save()

        # the following redirect is wrong. Here post is an object
        # you retrieved from a database, we usually redirect to a URL
        return redirect(post)

else:
     form = CommentForm()
comment_list = post.comments.all()

context={
        'post':post,
        'form':form,
        'comment_list':comment_list
        }

return render(request,'post_detail.html',context=context)

尝试以下操作以创建注释类:

class Comment(models.Model):

post = models.ForeignKey('blog.Post', on_delete=models.CASCADE, related_name='comments')
author = models.CharField(max_length=200)
text = models.TextField()
created_date = models.DateTimeField(default=timezone.now)
approved_comment = models.BooleanField(default=False)

def approve(self):
    self.approved_comment = True
    self.save()

def __str__(self):
    return self.text
在管理面板中注册注释模型

要在管理面板中注册注释模型,请转到blog/admin.py并添加以下行:

admin.site.register(Comment)
admin.site.register(Post)
该行正下方:

admin.site.register(Comment)
admin.site.register(Post)
记住也要在文件顶部导入注释模型,如下所示:

from django.contrib import admin
from .models import Post, Comment

admin.site.register(Post)
admin.site.register(Comment)
让我们的评论在HTML中可见:

<hr>
{% for comment in post.comments.all %}
 <div class="comment">
    <div class="date">{{ comment.created_date }}</div>
    <strong>{{ comment.author }}</strong>
    <p>{{ comment.text|linebreaks }}</p>
</div>
{% empty %}
<p>No comments here yet :(</p>
{% endfor %}

{%用于post.comments.all%中的注释} {{comment.created_date} {{comment.author}} {{comment.text | linebreaks}}

{%empty%} 这里还没有评论:(

{%endfor%}
什么是返回重定向(post)该怎么办?对不起,我当时很困惑,不知道自己在做什么。谢谢,我将注释功能代码放入了post_detail功能,并将注释提交到帖子的同一页,现在它似乎可以工作了,希望没问题。谢谢,我根据您的指南更改了代码,伙计,我对django知之甚少。