Ошибка типа: объект ‘module’ не вызывается функцией рендеринга Django 3

#python-3.x #django #django-3.0

#python-3.x #django #django-3.0

Вопрос:

Я просто создаю простую страницу hello world в своем приложении Django 3, я получаю сообщение об ошибке

 TypeError: 'module' object is not callable
 

Вот ошибка

 TypeError at /
'module' object is not callable
Request Method: GET
Request URL:    http://127.0.0.1:8000/
Django Version: 3.0.11
Exception Type: TypeError
Exception Value:    
'module' object is not callable
Exception Location: C:UsersadminAppDataRoamingPythonPython37site- packagesdjangotemplatecontext.py in bind_template, line 246
Python Executable:  C:Program Files (x86)Microsoft Visual 
StudioSharedPython37_64python.exe
Python Version: 3.7.8
Python Path:    
['C:\Users\admin\Repositories\django-docker\django-portal-base\app',
'C:\Program Files (x86)\Microsoft Visual '
'Studio\Shared\Python37_64\python37.zip',
'C:\Program Files (x86)\Microsoft Visual 
Studio\Shared\Python37_64\DLLs',
 'C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib',
 'C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64',
 'C:\Users\admin\AppData\Roaming\Python\Python37\site-packages',
 'C:\Program Files (x86)\Microsoft Visual '
 'Studio\Shared\Python37_64\lib\site-packages']
 Server time:   Thu, 14 Jan 2021 19:15:32  0000
 

Он работал раньше, но внезапно перестал работать сейчас. Вот мой views.py

 from django.shortcuts import render
# from django.http import HttpResponse
# from django.template import RequestContext, loader
# from django.template import Context

def index(request):
    """Placeholder index view"""
    print('XXXX')
    return render(request, 'hello_world/index.html')
    #return HttpResponse('Hello, World!')

def test(request):
    context = {'foo': 'bar'}
    return render(request, 'hello_world/index.html', context) 
 

Ошибка находится в строке return render(request, 'hello_world/index.html') , но когда я меняю ее на return HttpResponse('Hello, World!') нее, она работает нормально.

Мой HTML-файл очень прост index.html

 <h3> MY DJANGO APP</h3>
 

HTML-файл также находится в правильной папке templates/hello_world/index.html

Настройки

 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [os.path.join(BASE_DIR, 'templates')],
    'APP_DIRS': False,
    'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.request',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
            'django.contrib.sessions'
        ],
    },
},
]
 

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

1. у рендеринга проблемы с поиском hello_world/index.html . Вы должны проверить свою settings.py переменную TEMPLATES и посмотреть, соответствует ли путь местоположению папки вашего шаблона.

2. @Johnson Спасибо, но я не думаю, что это как-то связано с путем. Это правильно, и если я намеренно укажу неверный путь, ошибка будет TemplateDoesNotExist, что не так

3. @jackhammer013 Вероятно, это проблема, связанная с обработчиками контекста шаблона. Смотрите Строку 246 , она запускает процессоры контекста шаблона. Вероятно, потому, что контекстный процессор не вызывается. Пожалуйста, опубликуйте свои TEMPALTES настройки.

4. @xyres не уверен, есть ли проблема с моими настройками, но я опубликовал ее. Спасибо!

Ответ №1:

django.contrib.sessions не является вызываемым объектом, следовательно, он не является допустимым контекстным процессором.

На самом деле, это приложение, и поэтому оно должно быть в вашем INSTALLED_APPS списке, а не в TEMPALTES context_processors списке. Удаление его оттуда должно устранить эту проблему.


Почему это происходит?

В исключении упоминается, что это происходит в django/template/context.py строке 246 (в Django v3.0.11). Если вы видите исходный код в строке 246, вы можете увидеть, что в этой строке Django запускает зарегистрированные процессоры контекста шаблона. Поскольку django.contrib.sessions это не вызываемый объект, а модуль, вы получаете это сообщение об исключении : 'module' object is not callable .

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

1. Вау. Это сработало! Большое вам спасибо и за объяснение ошибки. Я не понял, что происходит. Также, возможно, я по ошибке поместил этот файл django.contrib.sessions. Вы сэкономили мне много времени. Спасибо!