【问题标题】:Delete a post in Django在 Django 中删除帖子
【发布时间】:2019-01-17 19:03:17
【问题描述】:

我是 django 新手,我正在尝试制作一个 Web 应用程序。我有这个页面page image,当我按下删除按钮时,我想删除一篇文章。我怎样才能做到这一点?这是我的“发布”模式:

class Post(models.Model):
    created_date = models.DateTimeField()
    title = models.CharField(max_length=100)
    profile_image = models.ImageField(upload_to='poze', blank=True, null=True)
    text = models.CharField(max_length=1000, default='Nimic', blank=True)
    user = models.ForeignKey(UserProfile, on_delete=models.CASCADE)

我一直在寻找删除方法,但我总是找到仅表单的方法并且我不使用表单。谢谢。

【问题讨论】:

  • 使用Post.objects.filter(pk=post_id).delete()删除

标签: python django


【解决方案1】:

在你的 html 中:

<a href="{% url 'delete' p.id %}">Delete</a>

假设您使用的是 for 循环:

{% for p in posts %}   

在您的网址中:

path('delete/<post_id>',views.delete_post,name='delete')

在你看来:

def delete_post(request,post_id=None):
    post_to_delete=Post.objects.get(id=post_id)
    post_to_delete.delete()
    return HttpResponseRedirect(#name of the view function that returns your posts page)

就是这样

编辑

此方法直接从您的数据库中删除数据。因此,我建议您将 @login_required 装饰器添加到您的 delete_post 视图函数中以保护您的帖子。您还可以在您的 html 中使其仅供管理员用户或帖子所有者访问(例如:只有具有员工角色的用户才能看到删除链接)

{% if user.is_staff %}
<a ...>Delete</a>
{% endif %}

【讨论】:

  • 这是非常不安全的,因为每个人都可以调用这些 URL 并且帖子将被删除。至少添加一个“login_required”更好的是检查帖子的所有者并额外添加一个“if request.user = owner...delete()”
  • 当然,他会根据自己的需要添加这些。我只是解释了这个过程,最终这就是他所要求的。
  • 我根据您的评论编辑了我的答案,谢谢。
  • 是的,只是想澄清一下,有些人只是简单地“复制和粘贴”代码,如果没有任何经过用户验证的检查,这里的这段代码可能很危险。很高兴你编辑了它:)
  • 完全同意!
【解决方案2】:

您应该在数据库表中创建一个新字段。每当您删除数据时,您都应该更改删除字段。

class Post(models.Model):
    created_date = models.DateTimeField()
    title = models.CharField(max_length=100)
    profile_image = models.ImageField(upload_to='poze', blank=True, null=True)
    text = models.CharField(max_length=1000, default='Nimic', blank=True)
    user = models.ForeignKey(UserProfile, on_delete=models.CASCADE)
    delete_flag = models.BooleanField(default=False)

无论何时你应该数据,那么你应该在删除标志上过滤数据

Post.objects.filter(delete_flag=False)

虽然它是主观的,我不知道你的用例,但作为初学者,最好从这种做法开始。

Read More

Article 2

【讨论】:

【解决方案3】:

您需要使用帖子 ID 传递参数。它想要这样的东西

p = Post.objects.get(pk=2)
p.delete()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 2021-09-27
    • 2021-07-09
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    相关资源
    最近更新 更多