You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中CreateView报'template not found'错误,求排查解决

Django CreateView 模板找不到错误解决

问题概况

用Django编写EventPostCreateView(继承自CreateView)时,持续触发TemplateDoesNotExist错误。ListView和DetailView可正常运行,手动添加template_name = "event_blog/eventpost_form.html"后问题仍未解决。

相关代码

views.py

from django.shortcuts import render
from django.views.generic import (
    ListView, DetailView, CreateView, DeleteView
)
from .models import EventPost

class EventPostListView(ListView):
    model = EventPost
    template_name = "event_blog/home.html"
    context_object_name = "event_posts"
    ordering = ['-date_posted']

class EventPostDetailView(DetailView):
    model = EventPost

class EventPostCreateView(CreateView):
    model = EventPost
    fields = ['name', 'location', 'locked', 'description', 'image']
    # 曾尝试添加:template_name = "event_blog/eventpost_form.html"

urls.py

from django.urls import path
from .views import *

urlpatterns = [
    path("", EventPostListView.as_view(), name="event-blog-home"),
    path("event/<int:pk>/", EventPostDetailView.as_view(), name="post-detail"),
    path("event/new/", EventPostCreateView.as_view(), name="post-create"),
]

创建表单模板代码

{% extends "event_blog/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
    <div>
        <form method="POST">
            {% csrf_token %} 
            <fieldset class="form-group">
                <legend class="border-bottom mb-4">New Event</legend>
            {{ form|crispy }}
            </fieldset>
            <div class="form-group">
                <button class="btn btn-secondary mt-3 mb-3" type="submit">Post</button>
            </div>
        </form>
    </div>
{% endblock content %}

模型代码

class EventPost(models.Model):
    name = models.CharField(max_length=100)
    location = models.CharField(max_length=100)
    locked = models.BooleanField(default=True, editable=True)
    description = models.TextField()
    attendance = models.IntegerField(default=0)
    image = models.ImageField(upload_to='event_pics', blank=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    date_posted = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.name

排查与解决步骤

1. 核对模板命名与路径

Django的CreateView默认查找模板规则为:<app名>/<模型名驼峰转下划线小写>_form.html。你的模型是EventPost,所以默认模板名应为event_blog/event_post_form.html(注意event_post是驼峰转下划线的写法)。

  • 检查模板文件名:如果文件名是eventpost_form.html(漏写下划线),要么将文件名改为event_post_form.html,要么将template_name修改为"event_blog/eventpost_form.html"(需确保文件确实存在于对应路径)。
  • 检查文件路径:模板必须放在event_blog/templates/event_blog/目录下(即app文件夹内的templates子目录中,需再创建一个与app同名的子文件夹存放模板)。正确目录结构示例:
    event_blog/
        templates/
            event_blog/
                home.html
                event_post_detail.html
                event_post_form.html
                base.html
        views.py
        urls.py
        models.py
    

2. 重启服务器清除缓存

若文件名与路径均正确仍报错,重启Django开发服务器并清除浏览器缓存——缓存可能导致模板未及时加载。

3. 验证模板配置

确认settings.py中的关键配置无误:

  • INSTALLED_APPS必须包含'event_blog'
  • TEMPLATES中的APP_DIRS需设为True,确保Django自动搜索app内的模板目录:
    INSTALLED_APPS = [
        # 其他应用
        'event_blog',
    ]
    
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [],
            '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',
                ],
            },
        },
    ]
    

总结

最可能的问题是模板文件名漏写下划线或未按app/templates/app/的结构存放模板,修正这两点即可解决错误。

内容的提问来源于stack exchange,提问作者KR03

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 20:03:10