Django: После обновления шаблона изменения не отражаются при обновлении страницы в браузере
Я тестирую представление на основе классов в моем приложении Django. В настоящее время я нахожусь в разработке, поэтому хочу видеть изменения в браузере, как только я внесу какие-либо изменения в шаблон.
Ниже представлен urls.py основного приложения:
urlpatterns = [
path('myapp/', include('myapp.urls')),
]
urls.py из myapp:
from django.urls import path, include
from . import views
urlpatterns = [
path('all/', views.AllView.as_view(), name="myapp-all"),
]
Файл views.py в myapp выглядит следующим образом:
from django.views import View
from django.template import loader
from django.http import HttpResponse
# Create your views here.
class AllView(View):
template = loader.get_template('myapp/all.html')
def get(self, request, *args, **kwargs):
return HttpResponse(self.template.render(request=request))
Шаблон all.html выглядит следующим образом:
{% extends 'base.html' %}
{% block title %} Example Table {% endblock %}
{% block content %}
<div class="d-flex justify-content-center">
<div class="col-8">
<table class="table table-striped">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">First</th>
<th scope="col">Last</th>
<th scope="col">Handle</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">1</th>
<td>Mark</td>
<td>Otto</td>
<td>@mdo</td>
</tr>
<tr>
<th scope="row">2</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">3</th>
<td colspan="2">Larry the Bird</td>
<td>@twitter</td>
</tr>
</tbody>
</table>
</div>
</div>
{% endblock %}
Приведенный выше шаблон хранится в каталоге ниже: base_directory -> myapp -> templates -> myapp -> all.html
Файл settings.py имеет следующую конфигурацию:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': ['core/templates'],
'APP_DIRS': True,
'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',
],
},
},
]
DEBUG = True
Как вы можете видеть, APP_DIRS установлен в true. Если я изменяю что-либо в шаблоне и обновляю страницу (созданную по этому url) в браузере, изменения не отражаются, и мне нужно перезапустить сервер, чтобы увидеть изменения. Что я делаю неправильно?
Полагаю, что ваш шаблон загружается только во время инициализации:
loader.get_template('myapp/all.html')
Вы можете попробовать следующее, что также предлагается в документации django:
class AllView(View):
template_name = 'myapp/all.html'
def get(self, request, *args, **kwargs):
return render(request, self.template_name)
Если вам нужно только отобразить шаблон, вы можете использовать TemplateView:
from django.views.generic import TemplateView
class AboutView(TemplateView):
template_name = 'myapp/all.html'
Для идеальной работы каталоги шаблонов должны быть связаны с BASE_DIR.
Попробуйте это:
'DIRS': [BASE_DIR / 'templates'],
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'templates'],
'APP_DIRS': True,
'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',
],
},
},
]
Note: Вы также должны написатьnameмнение вsnake_case, будет лучше, если вы измените его наname="myapp_all"сname="myapp-all".
Я думаю, что что-то с тем, как вы рендерите шаблон через загрузчик, файлы шаблона по умолчанию читаются с диска при каждом запросе, поэтому нет необходимости перезапускать что-либо, если вы только рендерите шаблон, я предлагаю вам использовать TemplateView
from django.views.generic.base import TemplateView
class AllView(TemplateView):
template_name = "myapp/all.html"
Существует кэширующий загрузчик шаблонов, но по умолчанию он отключен. Более подробную информацию смотрите в документации.