Как запретить пользователям удалять контент, созданный ими, в приложении django? - PullRequest
0 голосов
/ 11 ноября 2018

Я создал простой вопрос приложений, когда нажимал на вопросы, он показывает свои варианты или варианты. Я сделал логин и формы регистрации, чтобы сделать логин пользователя.

Я хочу знать, как я могу ограничить пользователя в удалении вопросов, созданных только им. У каждого вопроса есть ключ удаления напротив него.

Я прочитал большинство материалов о разрешениях, но не понял, как это сделать.

Я могу применить разрешение не удалять какой-либо вопрос, но как ограничить пользователя, чтобы он не удалял только некоторые конкретные вопросы или вопросы, которые они не создавали. ниже - 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 голосов
/ 11 ноября 2018

Возможно, request.user - это строка, содержащая идентификатор пользователя, поэтому вам необходимо получить объект пользователя с этим идентификатором, прежде чем сравнивать его с 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')
0 голосов
/ 11 ноября 2018

Вам следует отфильтровать ваши вопросы:

from django.db.models import Q
...
try:
    Question.objects.get(Q(id=question_id)&Q(user=request.user)).delete()
except Question.DoesNotExist:
    raise PermissionDenied("User can't delete this question.")
...

Объект Q позволяет вам логически работать с фильтрами.

Ссылка: https://docs.djangoproject.com/es/2.1/topics/db/queries/#complex-lookups-with-q-objects

Обновление: Как указано в комментариях, в данном конкретном случае вы можете добиться этого, выполнив следующие действия:

try:
    Question.objects.get(id=question_id, user=request.user).delete()
except Question.DoesNotExist:
    raise PermissionDenied("User can't delete this question.")
...