Django: URL-адрес перенаправляет не в тот файл, но в правильное местоположение: Ошибка TemplateDoesNotExist - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь отобразить файл с именем visit-form.html, но по какой-то причине Django продолжает искать файл с именем visit_form.html (разница в подчеркивании).Поэтому я получаю сообщение об ошибке TemplateDoesNotExist.

Я пытался очистить кеш браузера и сделать недействительным кеш Pycharm (File> invalidate cache).Я искал во всей программе файл или код visit_form.html, но ни один не может быть найден (я нашел один в старом пути к файлу и удалил файл без изменений).

Ошибка заключается в следующем, и первый URL-адрес находится в правильном расположении файла, но, похоже, проблема заключается в имени файла, от которого я не могу избавиться.

TemplateDoesNotExist at /clincher/visit/add/2
clincher/visit_form.html
Request Method: GET
Request URL:    http://127.0.0.1:8000/clincher/visit/add/2
Django Version: 2.0.4
Exception Type: TemplateDoesNotExist
Exception Value:    clincher/visit_form.html
Exception Location: /Users/nrsmoll/venv/lib/python3.6/site-packages/django/template/loader.py in select_template, line 47
Python Executable:  /Users/nrsmoll/venv/bin/python
Python Version: 3.6.4
Python Path:    
['/Users/nrsmoll/PycharmProjects/clincher',
 '/Users/nrsmoll/PycharmProjects/clincher',
 '/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip',
 '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6',
 '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload',
 '/Users/nrsmoll/venv/lib/python3.6/site-packages',
 '/Users/nrsmoll/venv/lib/python3.6/site-packages/setuptools-28.8.0-py3.6.egg',
 '/Users/nrsmoll/venv/lib/python3.6/site-packages/pip-9.0.1-py3.6.egg',
 '/Applications/PyCharm.app/Contents/helpers/pycharm_matplotlib_backend']
Server time:    Wed, 6 Jun 2018 09:20:19 +0000`

, а затем:

Template-loader postmortem
Django tried loading these templates, in this order:

Using engine django:

django.template.loaders.filesystem.Loader: /Users/nrsmoll/PycharmProjects/clincher/templates/clincher/visit_form.html (Source does not exist)
django.template.loaders.app_directories.Loader: /Users/nrsmoll/PycharmProjects/clincher/clincher/templates/clincher/visit_form.html (Source does not exist)
django.template.loaders.app_directories.Loader: /Users/nrsmoll/venv/lib/python3.6/site- 
packages/django/contrib/admin/templates/clincher/visit_form.html (Source does not exist)
django.template.loaders.app_directories.Loader: /Users/nrsmoll/venv/lib/python3.6/site- 
packages/django/contrib/auth/templates/clincher/visit_form.html (Source does not exist)

Urls.py

urlpatterns = [
    # /main/
   path('', views.index, name='index'),
    #/main/<main_id>/
    path('main/', views.MainListView.as_view(), name='main'),
    path('main/<int:pk>', views.MainDetailView.as_view(), name='main-detail'),
    path('visit/add/<int:pk>', views.VisitCreate.as_view(), name='visit-form'),
    url(r'main/add/$', views.MainCreate.as_view(), name='main-add'),
    #/main/main/2/
    url(r'^(?P<pk>[0-9]+)/$', views.MainUpdate.as_view(), name='main-update'),
    #/main/main/2/
    url(r'^(?P<pk>[0-9]+)/delete/$', views.MainDelete.as_view(), name='main-delete'),
]

Views.py

class VisitCreate(CreateView):
    model = Visit
    fields = ['fk_visit_main', 'visit_progress_notes']

    def get_success_url(self):
        return reverse('clincher:main-detail', args={'pk': self.object.id})

Settings.py

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [os.path.join(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',
        ],
    },
},
]

Исходная ссылка на visit-form (правильный файл):

HTML-шаблон

<td><a href="{% url 'clincher:visit-form' main.id %}"  role="button" class="btn btn-primary btn-xs">New Consult</a></td>

1 Ответ

0 голосов
/ 06 июня 2018

Имя шаблона не связано с именем в шаблонах URL.

Вы можете установить имя шаблона в своем представлении:

class VisitCreate(CreateView):
    model = Visit
    fields = ['fk_visit_main', 'visit_progress_notes']

    template_name = 'clincher/visit-form.html'

Однако, поскольку представление созданияпо умолчанию используется <app_name>/<model_name>_form.html (все строчные буквы), может быть лучше переименовать шаблон, чтобы использовать подчеркивание вместо дефиса.

...