【问题标题】:ValueError: invalid literal for int() with base 10: 'testuser1-2'ValueError: int() 以 10 为底的无效文字:'testuser1-2'
【发布时间】:2021-01-24 04:58:53
【问题描述】:

我正在尝试允许用户删除他们自己的 cmets。我收到了这个错误: ValueError: invalid literal for int() with base 10: 'testuser1-2 我也收到了这个错误: MultipleObjectsReturned get() returned more than one Comment -- it returned 4!

知道我的代码有什么问题吗?如果您需要任何其他信息,请告知

html

  {% for comment in blog_post.comments.all %}
  
  <br>
  {{ comment.body }}
  {% if comment.name == request.user %}

  <form action = "{% url 'HomeFeed:deletecomments' comment.post_id %}" method = "POST">     {% csrf_token %}

  <button>Delete</button>
</form>
     {% endif %}

  
  {% endfor %}

urls.py

    path('comments/<slug>', AddCommentView.as_view(), name= "add_comment"),
    path('deletecomments/<post_id>', delete_own_comment, name= "deletecomments"),

views.py

@login_required
def delete_own_comment(request, slug):
    if request.method == 'POST':
        post = BlogPost.objects.get(slug=slug)
        comment = get_object_or_404(Comment, post=post)
        if comment.name == request.user:
            comment.delete()
        return redirect('HomeFeed:detail', slug=slug)

models.py

class Comment(models.Model):
   post = models.ForeignKey(BlogPost, related_name='comments', on_delete=models.CASCADE)
   name = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='name', on_delete=models.CASCADE)
   body = models.TextField()
   date_added = models.DateField(auto_now_add=True)

class BlogPost(models.Model):
 chief_title                    = models.CharField(max_length=50, null=False, blank=False, unique=True)
 brief_description = models.TextField(max_length=300, null=False, blank=False)
 author                     = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
 slug                   = models.SlugField(blank=True, unique=True)

【问题讨论】:

  • get 应该总是返回一条记录并且只返回一条记录,否则你会得到一个错误。您的查询返回 4 条记录,最好使用 filter。

标签: django django-models django-views django-forms django-templates


【解决方案1】:

试试这个:

@login_required
def delete_own_comment(request, post_id):
    if request.method == 'POST':
        post = BlogPost.objects.get(id=post_id)
        # pay attention i use `post` instead of `post_id`
        comment = get_object_or_404(Comment, post=post)
        if comment.name == request.user:
            comment.delete()
        return redirect('HomeFeed:detail', slug=slug)

并通过添加 int 来更新您的 urls.py:

path('deletecomments/<int:post_id>', delete_own_comment, name= "deletecomments"),

这将确保您的post_id 在将其传递给您的视图之前转换为int。顺便说一句,它是可选的;)

【讨论】:

  • 嘿兄弟!感谢您的帮助,我稍后会尝试一下。只是想知道,如果我想授予博客文章作者删除他们文章中任何评论的权限,我可以创建一个 any 函数并使用:comment.blogpost.user = request.user
  • 让我们看看stackoverflow 的答案。对于特定用户的自定义权限。
  • 还有django's docs 链接。
  • 嗨兄弟,如果你有时间,你能看看这个问题吗@Mubasharjaved stackoverflow.com/questions/65870615/…
猜你喜欢
  • 2021-04-28
  • 1970-01-01
  • 2018-09-09
  • 2020-01-04
  • 2010-12-22
  • 2011-07-07
  • 2019-10-14
相关资源
最近更新 更多