【问题标题】:Exception Value: Field 'id' expected a number but got ''异常值:字段 'id' 需要一个数字,但得到了 ''
【发布时间】:2021-03-07 10:01:54
【问题描述】:

(我在 StackOverflow 上搜索了这个错误并尝试了解决方案,但是没有用。)

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

我在 Stackoverflow 上阅读了一些解决方案并尝试删除迁移文件(init.py 除外),然后我写了 python manage.py makemigrationspython 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中,我展示了文章的内容和发布者,cmets和likes)

<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

【问题讨论】:

  • 不知道您为什么还要发布"post_id",因为您的表单操作 url 有 id?意思是你不是在你的视图中得到一个变量id。所以你可以写get_object_or_404(Article, id=id)
  • 当我写 (Article, id=id) 时,我遇到另一个错误,上面写着“未定义名称‘文章’”
  • 我相信威廉已经回答了这个问题。重复有什么用?

标签: python django


【解决方案1】:

值为article.id,而不是article_id

&lt;button type="submit" name="post_id" value="{{ <b>article.id</b> }}" class="btn btn-primary btn-sm"&gt;

话虽如此,将它作为 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 请求访问。

【讨论】:

  • @mechaphantom: 是的,因为你分配给post = ...,然后使用article.likes..,而且通常也是request.user,而不是request.User
  • 感谢您的帮助。我在views.py 文件中编写了您的代码,但现在出现一个错误,提示ImportError: cannot import name 'require_http_method' from 'django.views.decorators.http'。你有什么想法吗?
  • @mechaphantom:你用的是什么版本的 Django?在 Django-3.1 中,这就是装饰器所在的位置:docs.djangoproject.com/en/3.1/topics/http/decorators
  • @mechaphantom 你缺少s 我相信应该是require_http_method 而不是require_http_methods
  • 谢谢你们两位。那行得通。现在我可以点赞文章,并且可以在管理面板中看到点赞。
猜你喜欢
  • 2021-08-31
  • 1970-01-01
  • 2021-06-10
  • 2021-07-03
  • 2021-06-03
  • 2021-01-22
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多