Как решить проблему "user.backend = backend AttributeError: 'NoneType' object has no attribute 'backend'" в Django Tests

Я новичок в django 3.6 и попытался написать тест, который включает использование force_login. Но каждый раз, когда я его запускаю, он выдает ошибку user.backend = backend AttributeError: 'NoneType' object has no attribute 'backend' даже когда мой параметр force_login backend уже установлен в django.contrib.auth.backends.ModelBackend

это мой тестовый код

def test_address_create_stores_user(self):
        user3 = models.User.objects.create_user('user3', 'pw432joij')
        post_data = {
            'name':'john kercher',
            'address1':'1 av st',
            'address2':'',
            'zip_code':'MA12GS',
            'city':'Manchester',
            'country':'uk',
            }
 
        self.client.force_login(user3, backend='django.contrib.auth.backends.ModelBackend')
        self.client.post(reverse('address_create', post_data))
        self.assertTrue(models.Address.objects.filter(user=user3).exists())

и вот какую ошибку он выдает

*ERROR: test_address_create_stores_user (main.tests.tests_views.TestPage)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Users\DD\Desktop\practical django\booktime\main\tests\tests_views.py", line 128, in test_address_create_stores_user
    self.client.force_login(user3, backend='hhh')
  File "C:\Users\DD\.virtualenvs\practical_django-UtJdiNPl\lib\site-packages\django\test\client.py", line 600, in force_login
    user.backend = backend
AttributeError: 'NoneType' object has no attribute 'backend'*

Я вижу, что ваш вопрос относится к сентябрю 2022 года, поэтому не знаю, разобрались ли вы с этим или вам все еще нужен ответ.

У меня была похожая проблема. Ваш вопрос заставил меня перепроверить кое-что в моем коде, и я решил его со своей стороны. Таким образом, я думаю, что у меня есть представление о том, в чем, скорее всего, заключается ваша проблема (невозможно сказать, не видя больше вашей кодовой базы). Я отвечу на ваш вопрос в двух частях:


  1. Кое-что, что вы считаете проблемой (но, скорее всего, это не так) - это бэкенд auth. По умолчанию Django указывает django.contrib.auth.backends.ModelBackend в качестве бэкенда auth по умолчанию. Таким образом, это будет автоматически распространяться на ваш тестовый клиент. Другими словами, указывать это в методе force_login() нет необходимости.

Примечание: Если вы когда-нибудь зададитесь вопросом "подходит ли бэкенд auth по умолчанию для моего проекта?", то ответ почти наверняка будет "да". По моему опыту, вы поймете, когда бэкенд по умолчанию не подходит, потому что будут определенные критерии/условия входа, которые он не сможет выполнить для конкретного случая использования. Однако для подавляющего большинства случаев использования бэкэнд по умолчанию вполне подходит.


  1. Фактическая проблема (скорее всего) заключается в том, что self.client.force_login() ожидает в качестве первого аргумента правильную модель пользователя. Ошибка даже довольно прямо указывает, что она получает "объект NoneType". Оно же ключевое слово None, оно же нулевая переменная.

Я не могу сказать наверняка, не видя дальнейшего кода. Но я бы предположил, что где-то в вашем проекте происходит переопределение функции create_user(). И, скорее всего, эта переопределенная функция не возвращает правильный пользовательский объект. Это может быть просто забытый оператор возврата. А может быть, нарушена логика создания пользователя. Понятия не имею.

Если я прав, то если вы выведете user3 на консоль, прежде чем что-то с ним делать, то, скорее всего, будет выведено None. Исправьте это, и функция force_login() должна работать.

Вернуться на верх