Почему условный оператор request.user == ‘admin’ не работает в Django3 views.py ?

#django #django-views

#django #django-представления

Вопрос:

В настоящее время я зарегистрирован как «администратор» в моем проекте django3. Как «администратор», я должен отображать все книги. Но if-else утверждение в views.py не распознает «admin» и всегда переходит в else раздел условного оператора.

 def book_list(request):
    print ('Currently logged as ', request.user)
    if request.user == 'admin':
        print ('All')
        books = Book.objects.all()
    else:
        print ('Filter')
        books = Book.objects.filter(author=request.user)
    return render(request, 'mtsAuthor/book_list.html', {
        'books': books
    })
 

Когда я обновляю страницу как «администратор», в терминале отображаются следующие пользовательские сообщения отладки. Надеюсь, то же самое поможет устранить неполадки.

 Currently logged as  admin
Filter
[25/Feb/2021 13:39:45] "GET /mtsAuthor/books/ HTTP/1.1" 200 9363  
[25/Feb/2021 13:39:45] "GET /media/books/covers/_DSC0179.jpg HTTP/1.1" 304 0
 

Ответ №1:

Если вы хотите проверить это на основе имени пользователя:

 if request.user.username = 'admin'
 

И если вы хотите проверить это на основе суперпользователя:

 if request.user.is_superuser
 

Ответ №2:

попробуйте это:

 if request.user.is_superuser
 

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

1. Спасибо! Но интересно, почему if-else работает странно?

2. Поскольку он не знает, о чем судить, вы должны предоставить ему такие атрибуты, как usernname, is_active, request.user является экземпляром.

3. @chandra if-else работает странно, потому request.user что это словарь. Вы сравниваете объект, подобный dict, со строковым объектом со значением «admin». print(dict(request.user)) Попытайтесь увидеть значение.

4. request.user это не словарь, это User экземпляр, «странность» заключается в том, что вы сравнивали User экземпляр со строкой (на самом деле вы сравнивали идентификаторы User экземпляра и строки)