在Django应用中,如何防止用户删除非他们创建的内容?

时间:2018-11-10 21:37:28

标签: python django authentication view web-development-server

我创建了一个简单的问题应用程序,单击问题时会显示其选项或选择。我制作了登录和注册表格以进行用户登录。

我想知道如何限制用户删除仅由他们创建的问题。每个问题的前面都有一个删除键。

我阅读了大多数有关权限的内容,但没有了解如何做。

我可能会申请许可,而不是删除任何问题,而是如何限制用户不要仅删除某些特定问题或不是由他们创建的问题。 下面是views.py

def addquestion(request):
    item_to_add = request.POST['content']
    item = Question.objects.create(question_text=item_to_add,pub_date=timezone.now())
    user_now = Question(user = request.user)
    item.save()

    return HttpResponseRedirect('/home/questions')


def deletequestion(request,question_id):

    item_to_delete = Question.objects.get(id=question_id)
    if item_to_delete.user == request.user:
        item_to_delete.delete()
    else:
    return HttpResponse('You are not authorised to delete this question')

这是模型.py

from django.db import models
from vote.models import VoteModel
from django.contrib.auth.models import User

# Create your models here.
class Question(VoteModel,models.Model):

    question_text = models.TextField(max_length=300)
    pub_date = models.DateTimeField('date published')
    user = models.OneToOneField(User,on_delete = models.CASCADE,null=True)

    def __str__(self):
        return self.question_text

class Choice(models.Model):
    choice_text = models.CharField(max_length=300)
    votes = models.IntegerField(default=0)
    question = models.ForeignKey(Question,on_delete = models.CASCADE)

    def __str__(self):
        return self.choice_text

2 个答案:

答案 0 :(得分:1)

您应该过滤问题查询集:

ICD9

Q对象使您可以在逻辑上使用过滤器。

参考:https://docs.djangoproject.com/es/2.1/topics/db/queries/#complex-lookups-with-q-objects

更新: 正如评论中指出的那样,在这种特殊情况下,您可以通过执行以下操作来实现:

Freq

答案 1 :(得分:0)

也许request.user是一个包含用户ID的字符串,因此您必须先将该ID的用户对象与item_to_dele.user进行比较。

logged_user = User.objects.get(id=request.user)
if logged_user == item_to_delete.user:
    # delete
    item_to_delete.delete()
else:
    return HttpResponse('You are not authorised to delete this question')