Частный канал Django — если self.object. # (потребитель: тот или иной: продавец # != запрос.пользователь:

#python #django

#python #django

Вопрос:

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

 class Group(models.Model):
    consumer = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="", blank=True, null=True)
    name = models.CharField(max_length=10)
    seller = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="")
    ...

    def __str__(self):
        return self.name

#Detail channel
@method_decorator(login_required(login_url='/cooker/login'),name="dispatch")
class CheckoutDetail(generic.DetailView):
    ...
    
    def get(self,request,*args,**kwargs):
        self.object = self.get_object()
        if self.object.consumer or self.object.seller != request.user: #it's redirect me to home page
            return HttpResponseRedirect('/')    
        
        return super(CheckoutDetail, self).get(request,*args,**kwargs)
  

Ответ №1:

Правильная логика была бы

 if not (request.user == self.object.consumer or request.user == self.object.seller):
    return redirect(...)
  

но я бы преобразовал эту логику в функцию в object , например

 def has_access(self, user):
    return (self.consumer == user or self.seller == user)
  

а затем вызовите его, например

 if not self.object.has_access(user=request.user):
    # ...
  

Комментарии:

1. Спасибо 🙂 вы прекрасно поняли, что мне было нужно

Ответ №2:

Если я правильно вас понимаю, вы должны изменить эту строку следующим образом:

     if self.object.consumer != request.user and self.object.seller != request.user:
        return HttpResponseRedirect('/')   
  

Комментарии:

1. извините, я не совсем ясно выразился. Предположим, что я потребитель, и я создаю канал с одним пользователем (например, x), продавцом. Я хочу, чтобы x и я имели доступ к этому каналу.

2. с вашим кодом, поскольку я потребитель, я не могу получить к нему доступ 🙂 это должно быть одно или другое

3. Нет проблем 🙂 Я застрял, чтобы понять вас еще больше 🙂 Извините за мой плохой английский, может быть, я не могу понять суть проблемы: ( вы хотите, если все исправить, вы не хотите возвращать HttpResponseRedirect(‘/’) ? это правда ?