Django TemplateDoesNotExist报错:模板路径匹配问题排查
问题分析与解决
你遇到的情况是:模板文件实际存放在绝对路径/home/user/Desktop/ais/django-cruds-adminlte/demo/demo/templates/testapp/athlete/acrud/create.html,但访问/testapp/athlete/create时触发TemplateDoesNotExist错误,错误里列出了testapp/athlete/acruds/create.html, acruds/create.html这两个路径。下面分两部分解答你的疑问:
一、为什么错误信息里的路径用逗号分隔?
Django在查找模板时,会按照预设的模板查找顺序依次检查多个候选路径,当所有尝试的路径都找不到对应模板文件时,就会把这些它试过的路径用逗号分隔列出来,明确告诉你它搜索过哪些位置但都没命中。
具体到你的场景:
testapp/athlete/acruds/create.html:这是结合你的app名称(testapp)、模型名称(athlete)和视图里设置的template_name_base = 'acruds'拼接出的具体路径acruds/create.html:这是仅使用template_name_base和视图类型(create)拼接的通用路径
Django会优先查找更具体的app+模型+模板基路径组合,找不到再尝试通用模板路径,最终没找到就把这两个候选路径都列在错误信息里。
二、如何解决TemplateDoesNotExist报错?
从你的代码和实际文件路径来看,核心问题是模板路径的拼写不一致:
- 你实际的模板文件夹是
acrud(单数),路径为testapp/athlete/acrud/create.html - 但视图里设置的
template_name_base = 'acruds'(复数),导致Django去查找带复数后缀的路径
你可以二选一解决:
- 修改模板文件夹名称:把
acrud文件夹重命名为acruds,让它和视图配置的template_name_base保持一致,这样路径就和Django查找的第一个候选路径完全匹配 - 修改视图配置:把
view.py里的template_name_base = 'acruds'改成template_name_base = 'acrud',让Django去搜索你现有的acrud文件夹下的模板
另外,也可以顺便检查下settings.py里的TEMPLATES配置,确保'APP_DIRS': True已经开启,这是Django自动识别app内templates文件夹的关键配置。
附:你的代码片段
forms.py
class AthleteForm(forms.ModelForm): class Meta: model = Athlete fields = '__all__' def __init__(self, *args, **kwargs): super(AthleteForm, self).__init__(*args, **kwargs) self.helper = FormHelper(self) self.helper.form_tag = False self.helper.layout = Layout( Tab( _('Basic information'), Field('name', wrapper_class="col-md-6"), Field('image', wrapper_class="col-md-6"), ) ) self.helper.layout.append( FormActions( Submit('submit', _('Submit'), css_class='btn btn-primary'), HTML("""{% load i18n %}<a class="btn btn-danger" href="{{ url_delete }}">{% trans 'Delete' %}</a>"""), ) )
views.py
class AthleteCRUD(CRUDView): model = Athlete template_name_base = 'acruds' # customer cruds => ccruds namespace = None check_login = True check_perms = True views_available = ['create'] fields = ['name', 'image'] # related_fields = ['invoice'] custom_forms = { 'add_': AthleteForm, # 'update_customer': CustomerForm, # 'add_addresses': AddressesForm, # 'update_addresses': AddressesForm, } modelforms = custom_forms
内容的提问来源于stack exchange,提问作者F128115
相关产品推荐
相关产品推荐

