Python django can';不要向数据库提交评论
我试图在我的django应用程序中添加一个注释功能,但无论我做了什么,提交的注释都不会显示在数据库中,我不知道为什么。这是我使用过的一些代码,请看一下 模型是一部分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
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知之甚少。