异常值:字段 'id' 需要一个数字,但得到了 ''

时间:2021-03-07 10:01:54

标签: python django

(我在 StackOverflow 上搜索了这个错误并尝试了解决方案的想法,但没有奏效。)

在我的 Django 项目中,我尝试向我的文章详细信息页面添加一个赞按钮。如果用户喜欢这篇文章,他们会点击喜欢按钮并返回相同的文章页面。我在 Youtube 上看到 this video 并根据我的项目通过更改一些值来编写相同的代码。但是我遇到了一个错误,它说 Field 'id' 需要一个数字但得到了 ''。

我在 Stackoverflow 上阅读了一些解决方案并尝试删除迁移文件(init.py 除外),然后我写了 python manage.py makemigrations 然后 python manage.py migrate. 不幸的是,它不起作用。我想分享我的代码,所以也许你可以给我一些解决方案的想法。

模型.py

class Article(models.Model):
    author = models.ForeignKey("auth.User", on_delete = models.CASCADE, verbose_name="Kullanıcı")
    title = models.CharField(max_length = 50, verbose_name="Başlık")
    content = RichTextField()
    created_date = models.DateTimeField(auto_now_add = True, verbose_name="Oluşturma Tarihi")
    likes = models.ManyToManyField(User, related_name='blog_post')

urls.py

urlpatterns = [
    path('dashboard/',views.dashboard, name ="dashboard"),
    path('addarticle/',views.addarticle, name ="addarticle"),
    path('article/<int:id>',views.detail, name ="detail"),
    path('update/<int:id>',views.updateArticle, name ="update"),
    path('delete/<int:id>',views.deleteArticle, name ="delete"),
    path('',views.articles, name ="articles"),
    path('comment/<int:id>',views.addComment, name ="comment"),
    path('like/<int:id>',views.LikeView, name ="like_post"),
]

views.py

def LikeView(request, id):
    post = get_object_or_404(Article, id=request.POST.get("post_id"))
    article.likes.add(request.User)
    return HttpResponseRedirect(reverse("detail", args=[str(id)]))

detail.html(在这个 html 中,我展示了文章的内容和发表者、评论和点赞)

<form action="{% url 'article:like_post' article.id %}" method="POST">
        {% csrf_token %}
        <button type="submit" name="post_id" value="{{ article_id }}" class="btn btn-primary btn-sm">
        <i class="bi bi-hand-thumbs-up"></i> Like
        </button>
</form>

您可以在 this photo 中看到喜欢表 我可以在管理页面中喜欢帖子。但显然这不适合用户。

这就是我遇到的 error page

1 个答案:

答案 0 :(得分:3)

值是article.id,而不是article_id

<button type="submit" name="post_id" value="{{ article.id }}" class="btn btn-primary btn-sm">

话虽如此,将它同时作为 URL 参数和作为 POST 参数传递没有多大意义。您可以简单地制作一个没有 post_id 的表单,并使用 URL 参数代替:

from django.shortcuts import redirect
from django.views.decorators.http import require_POST

@require_POST
def LikeView(request, id):
    post = get_object_or_404(Article, id=id)
    post.likes.add(request.user)
    return redirect('detail', id)

然后表单看起来像:

<form action="{% url 'article:like_post' article.id %}" method="POST">
    {% csrf_token %}
    <button type="submit" class="btn btn-primary btn-sm">
    <i class="bi bi-hand-thumbs-up"></i> Like
    </button>
</form>

<块引用>

注意:可以使用 @require_POST decorator [Django-doc] 将视图限制为只能由 POST 请求访问。