2017-01-13 6 views
1

Я пытаюсь ограничить экземпляры объекта, которые будут доступны для просмотра только пользователям, на которые ссылается этот объект через OneToOneField. Я использую mixin "user_passes_test" в DetailView для сравнения request.user с пользователем в отношениях OnetoOne. Я получил некоторую помощь по django irc, которая привела меня к безуспешной попытке реализовать get_object, но я все еще застрял (я новичок в Django & Python).Django - передать связанный объект как переменную в user_passes_test mixin

Модель:

class Event(models.Model):  
    client = models.OneToOneField(settings.AUTH_USER_MODEL) 

Вид:

class EventDetail(UserPassesTestMixin, DetailView): 
    model = Event 

    def test_func(self): 
     if self.request.user == self.model.client: 
      return True 
     else: 
      return False 

которую ссылается пользователь в своем приложении, так как пользователь (AbstractUser)

+0

Как вы используете эту функцию 'test_func'? – AKS

ответ

1

Если вы используют DetailView, тогда вы можете реализовать е get_queryset метод в представлении:

class EventDetail(DetailView): 
    model = Event 

    def get_queryset(self): 
     queryset = super(DetalView, self).get_queryset() 
     return queryset.filter(client=self.request.user) 

Это убедитесь, что Event объекты ограничены пользователем, как только клиент.

Я не уверен, какой URL-адрес вы используете для доступа к мероприятию, и почему существует только OneToOne отношение между и User. Но если это отношение OneToOne, то queryset после этой реализации будет содержать только один объект. (который может быть или не быть основным ключом, с помощью которого вы получаете доступ к этому событию).

+0

Я использую OneToOne над ForeignKey, потому что всегда будет только 1 событие, связанное с 1 пользователем. – brandondavid

+0

(я не понимал, что нажатие вводит сохраненный комментарий!) - url вызывает объект Event с pk, например: http: // localhost: 8000/events/3/ - Поэтому я до сих пор не уверен, как использовать выход get_queryset в тестовой функции. – brandondavid

+0

Теперь я вижу, что ваше решение заменяет тестовую функцию, и она отлично работает! Но я использовал тестовую функцию, чтобы я мог также предоставить условие if/else, которое позволяет пользователю, помеченному как «персонал», также просматривать объект. Используя свое решение, как можно проверить функцию и разрешить ли пользователь? – brandondavid

1

я, наконец, получил его, я думаю, что мне потребовалось писать его, чтобы понять, что я мог бы просто положить если/другое условие на QuerySet так:

def get_queryset(self): 
    queryset = super(DetailView, self).get_queryset() 
    if self.request.user.is_staff: 
     return queryset 
    else: 
     return queryset.filter(client=self.request.user) 

Спасибо АКС!