Django返回TemplateDoesNotExist用于命名空间的应用模板,这些模板由类视图呈现,但适用于普通函数视图

gjmwrych  于 2023-07-01  发布在  Go
关注(0)|答案(1)|浏览(100)

我是Django的新手,有一个项目myproject,里面有一个应用程序users。我不明白为什么在用户应用程序中的一个名为templates的文件夹内的子目录中的my templates的名称间距(因此路径是myproject/users/templates/users/)不适用于基于类的视图,但它适用于常规函数视图。
当使用基于类的视图时,我得到错误消息Templateloader postmortem,内容是:

django.template.loaders.app_directories.Loader: /home/me/projectmainfolder/myproject/users/templates/signup_form.html (Source does not exist)

django.template.loaders.app_directories.Loader: /home/me/projectmainfolder/penv/lib/python3.10/site-packages/django/contrib/admin/templates/signup_form.html (Source does not exist)

django.template.loaders.app_directories.Loader: /home/me/projectmainfolder/penv/lib/python3.10/site-packages/django/contrib/auth/templates/signup_form.html (Source does not exist)

当我将模板从名称间隔的子目录中移到templates中时,它工作得很好。
users/urls.py是:

from django.urls import path, include
from . import views

app_name = "users"

urlpatterns = [
    
    path("accounts/", include("django.contrib.auth.urls")),
    # works fine
    path("accounts/test", views.testdef, name="test"),
    #doesn't work
    path("accounts/signup/user", views.UserSignupView.as_view(), name="signup_form"),
]

常规函数testdef is

def testdef(request):
    return render(request, "users/test.html")

类视图UserSignupView是:

class UserSignupView(CreateView):
    model = CustomUser
    form_class =UserProfileSignupForm
    template_name = 'signup_form.html'

    def somefunction(self, **kwargs):
        ...

任何想法如何解决这是非常赞赏。我想根据Django的文档来保持事物的名称间隔。
我试着移动文件,发现这种方式很成功,但考虑到Django告诉你以某种方式组织,它似乎不是最佳的。

brc7rcf0

brc7rcf01#

如果启用了**APP_DIRS**设置[Django-doc],Django会在应用程序的templates/目录中进行搜索,并且这适用于所有应用程序。
因此,这意味着您确实可以通过定义子目录来定义名称空间,然后在模板名称中使用子目录。如果你的模板存储在users/template/**users/signup_form.html**,你可以让Django使用以下命令查找模板:

class UserSignupView(CreateView):
    model = CustomUser
    form_class = UserProfileSignupForm
    template_name = 'users/signup_form.html'

这对于基于函数的视图和基于类的视图是相同的。
模板加载器在**render(…)TemplateResponseMixin.render_to_response(…)**方法[Django-doc]之间没有不同(至少在这方面没有)。

相关问题