inspector_shnirevadze
@inspector_shnirevadze

Django говорит TemplateDoesNotExist at /contact/contact_form.html, но в коде нигде нет «contact_form.html». Как исправить ошибку?

Делаю рассылку сообщений на Email. После ввода почты и нажатия на кнопку, подписка не отображается в админке и у меня появляется такая ошибка
<b>TemplateDoesNotExist at /contact/
contact/contact_form.html</b>

Request Method:	GET
Request URL:	http://127.0.0.1:8000/contact/?csrfmiddlewaretoken=uthT5NKvo2FVz1CJPVMuOeNfey7BzBDxyDWbNe1Yvz12UWywFai6nUyEHkX2c7qY&email=mr.kostik2014%40gmail.com
Django Version:	3.0.5
Exception Type:	TemplateDoesNotExist
Exception Value:	
contact/contact_form.html
Exception Location:	C:\Users\user\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\template\loader.py in select_template, line 47
Python Executable:	C:\Users\user\AppData\Local\Programs\Python\Python38-32\python.exe

При этом я нигде в коде не указывал "contact_form.html". Его нет, но django стучится на него. Если добавить то ничего не произойдет. Делаю по видео с ютуба.

Структура папок:
my_project/
    contact/
        temlatetags/
            __pycache__
            __init__.py
            contact_tags.py
        forms.py
        models.py
        urls.py
        views.py
    templates/
        contact/
            tags/
                contact_form.html


models.py:
from django.db import models

class Contact(models.Model):
    '''подписка на рассылку'''
    email = models.EmailField()
    date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.email


views.py:
from django.views.generic import CreateView
from .models import Contact
from .forms import ContactForm


class ContactView(CreateView):
    model = Contact
    form_class = ContactForm
    success_url = "/"


forms.py:
from django import forms
from .models import Contact


class ContactForm(forms.ModelForm):
    '''форма подписки'''

    class Meta:
        model = Contact
        fields = ("email",)
        widgets = {
            "email": forms.EmailInput(attrs={"class": "form-control"})
        }


urls.py проекта:
from django.conf.urls import include
from django.urls import path
from django.contrib import admin

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/', include('blog.urls', namespace='blog')),
    path('contact/', include('contact.urls')),
    path('', include('main.urls', namespace='main')),
]

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)


urls.py приложения:
from django.urls import path
from .views import ContactView


urlpatterns = [
    path("", ContactView.as_view(), name="contact")
]


contact_tags.py:
from django import template
from contact.forms import ContactForm


register = template.Library()


@register.inclusion_tag("contact/tags/form.html")
def contact_form():
    return {"contact_form": ContactForm()}


contact_form.html
<div class="sidebar-box subs-wrap img" style="background-image: url(images/bg_1.jpg);">
    <div class="overlay"></div>
    <h3 class="mb-4 sidebar-heading">Newsletter</h3>
    <p class="mb-4">Far far away, behind the word mountains, far from the countries Vokalia</p>
    <form action="{% url 'contact' %}" class="subscribe-form">
        <div class="form-group">
            {% csrf_token %}
            {{ contact_form }}
            <input type="submit" value="Subscribe" class="mt-2 btn btn-white submit">
        </div>
    </form>
</div>


сайдбар, в котором располагается форма:
{% load contact_tags %}

<!-- место для формы подписки -->
{% contact_form %}
  • Вопрос задан
  • 354 просмотра
Решения вопроса 1
При этом я нигде в коде не указывал "contact_form.html".


По-умолчанию CreateView, если явно не указать путь к файлу шаблона, пытается использовать шаблон со стандартным названием.

В твоём случае это /contact/
contact/contact_form.html


Можно решить это, добавив этот файл по указанному пути или самостоятельно указать поле
class ContactView(CreateView):
    template_name="path/to/my/template.html"
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Мне кажется у вас в сайтбаре где долга располагаться форма должно быть написано что вороне
{%block contact_form%} {%endblock%}
Ответ написан
Комментировать
Sobolev5
@Sobolev5
Python developer
В дополнении к вышесказанному могу порекомендовать очевидный лайфхак.

git grep "contact_form.html"

Разумеется здесь он ничего не найдет, т.к. django пытается автоматически создать путь к файлу, но в общем и целом эта команда весьма помогает при решении проблем "что то там найти и понять где это".
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы