Передать Queryset из декоратора в функцию - PullRequest
0 голосов
/ 12 мая 2018

У меня есть декоратор, который выполняет тот же запрос, что и функция, к которой он прикреплен.Есть ли способ просто передать Queryset из декоратора, чтобы мне не нужно было выполнять запрос дважды?

decorator.py

def is_wifi_author(func):
    def wrapper(request, wifi_id, **kwargs):
        wifi = get_object_or_404(Wifi, pk=wifi_id)             # Queryset

        # Is this correct?    
        if request.user != wifi.author:
            return redirect('youshallnotpass')

        return func(request, wifi_id, **kwargs)

    return wrapper

views.py

@is_wifi_author
def edit(request, wifi_id):
    # print(request)
    wifi = get_object_or_404(Wifi, pk=wifi_id)                 # Same queryset

    # The rest of the view

    return render(request, 'app/template.html')

Да, просто проверяю, есть ли у пользователя доступ для редактирования сообщения.Любые комментарии приветствуются.

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Да, это возможно с помощью kwargs:

def is_wifi_author(func):
    def wrapper(request, wifi_id, **kwargs):
        wifi = get_object_or_404(Wifi, pk=wifi_id)             # Queryset

        # Is this correct?
        if request.user != wifi.author:
            return redirect('youshallnotpass')

        return func(request, wifi_id, wiki=wiki, **kwargs)

    return wrapper


@is_wifi_author
def edit(request, wifi_id, wiki=None):
    """wiki argument is gonna be updated by the is_wifi_author decorator"""
    print('Yeii, a wiki', wiki)
    # The rest of the view

    return render(request, 'app/template.html')

Хотя я думаю, что в ответе @Ubaid упоминается правильная точка.

0 голосов
/ 12 мая 2018

Зачем использовать декоратор, когда вы можете просто сделать

wifi = get_object_or_404(Wifi, pk=wifi_id, author=request.user) 
...