(我在 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。
答案 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 请求访问。