我想在我的评论模型中创建对象。 这是我对帖子的回复模型。
class Reply(MPTTModel):
post = models.ForeignKey(Post, on_delete=models.CASCADE)
detail = models.CharField(max_length=50, null=True, blank=True, unique=True)
pub_date = models.DateTimeField(auto_now_add=True)
last_edited = models.DateTimeField(auto_now=True)
author = models.ForeignKey(User, on_delete=models.CASCADE)
class MPTTMeta:
order_insertion_by = ['name']
这是我的回复视图功能。
def post_detail(request,id,**kwargs):
post = Post.objects.all().filter(id=id)
comment = CommentReply.objects.filter(post=id)
context = {'post': post, 'comment': comment}
if request.method == 'POST':
comments = request.POST.get('comment')
Reply.objects.create(
post=post, detail=comments, author = request.user)
else:
return render(request, 'khalidblog_app/full_detail.html', context)
return render(request,'khalidblog_app/full_detail.html',context)
我在模板中使用 for 循环:
{% for post in post %}
<img alt='' src='{{ post.image.url }}' class='avatar avatar-80 photo' height='80' width='80' />
<div class="eltd-author-description-text-holder">
<h5 class="eltd-author-name"> {{post.author}} </h5>
<div class="eltd-author-text">
<p>{{post.title}}</p>
</div>
<div class="eltd-author-text">
<p>{{post.content}}</p>
<hr>
</div>
{%endfor%}
当我运行这个视图函数时,它显示如下值错误。
Cannot assign "<QuerySet [<Post: Author : zorainTiTleFirst PostDated :2021-01-17 16:27:47.043869+00:00>]>": "Reply.post" must be a "Post" instance.
如何使用此视图函数在此回复模型中设置 forignkey(Post)?
答案 0 :(得分:1)
您的“post”变量指向 Post 对象的 QuerySet,而不是单个实例。您应该使用 get() 而不是 filter() 如下:
post = Post.objects.get(id=id)
更新:您在评论中分享了您在模板中使用了 for 循环。 for 循环旨在迭代一组对象(例如,将使用 filter() 返回的 QuerySet)。如果只想渲染单个实例的字段值,则不需要使用 for 循环。
Here 是 Django 文档的链接,用于 filter() - 它返回一个 QuerySet(对象组)。
Here 是 Django 文档的链接,用于 get() - 返回单个对象。
答案 1 :(得分:1)
在函数的第一行,您使用了 .filter() 方法,该方法返回 QuerySet(简称为 List of Objects),您应该在理想情况下使用 .get() 方法。 .get() 返回第 6 行的赋值实际期望的单个对象。
答案 2 :(得分:0)
由于您的“post”变量指向 Post 对象的 QuerySet,您可以直接选择 QuerySet 中的第一个元素,如下所示:
Reply.objects.create(
post=post[0], detail=comments, author = request.user)