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"

Существует кэширующий загрузчик шаблонов, но по умолчанию он отключен. Более подробную информацию смотрите в документации.

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