我是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告诉你以某种方式组织,它似乎不是最佳的。
1条答案
按热度按时间brc7rcf01#
如果启用了**
APP_DIRS
**设置[Django-doc],Django会在应用程序的templates/
目录中进行搜索,并且这适用于所有应用程序。因此,这意味着您确实可以通过定义子目录来定义名称空间,然后在模板名称中使用子目录。如果你的模板存储在
users/template/**users/signup_form.html**
,你可以让Django使用以下命令查找模板:这对于基于函数的视图和基于类的视图是相同的。
模板加载器在**
render(…)
和TemplateResponseMixin
的.render_to_response(…)
**方法[Django-doc]之间没有不同(至少在这方面没有)。