Функция тестирования UserPassesTestMixin с отношением многие ко многим не работает - PullRequest
0 голосов
/ 21 июня 2020

Я делаю сайт со списками покупок. Одной из функций будет возможность поделиться своим списком с кем-нибудь. Проблема в том, что я не могу понять, как заставить test_fun c в UserPassesTestMixin работать с ним.

views:

class ListDetailUpdateView(LoginRequiredMixin,UserPassesTestMixin, CreateView):
   model = ShoppingItem
   template_name = 'xlist_app/ListDetailUpdateView.html'
   context_object_name = 'products'
   fields = ['name', 'count'] 
 ...
   def test_func(self):
       shop_list_id= self.request.resolver_match.kwargs['pk']
       shop_list = ShoppingList.objects.get(id=shop_list_id)
       if self.request.user == shop_list.owner     or      self.request.user == shop_list.owners:
           return True
       return False

models:

class ShoppingList(models.Model):
   list_name = models.CharField(max_length=50, null=False)
   date_created = models.DateTimeField(auto_now=True)
   owner = models.ForeignKey(get_user_model(), on_delete=models.CASCADE, 
           related_name='shopping_lists', 
   null = True, blank=True)
   owners = models.ManyToManyField(User)

Как вы Как видите, у меня есть поле «владелец», в котором хранится этот список, и «владельцы», в котором хранятся пользователи, которым предоставлен доступ к списку. Мне нужна помощь с этой частью:

self.request.user == shop_list.owners

Как заставить его работать или почему не работает? (Когда я делюсь списком из другой учетной записи себе, выскакивает «403 Forbidden»)

1 Ответ

0 голосов
/ 21 июня 2020

Хорошо, мне просто нужно было использовать 'for' вот так:

    def test_func(self):
    shop_list_id= self.request.resolver_match.kwargs['pk']
    shop_list = ShoppingList.objects.get(id=shop_list_id)
    #Solution:
    for own in shop_list.owners.all():
        if own == self.request.user:
            return True
    if self.request.user == shop_list.owner:
        return True
    return False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...