好的,所以我是Django的新手但不是MVC世界(在Grails中构建一些应用程序)......但我似乎和一群人有同样的问题,我希望有人可以摆脱一些真实的关于Django基于类的通用视图。在Grails世界中,“模板”或通用视图可以由框架生成,我相信Django也是如此,但如果你遵循1.7“编写你的第一个django应用程序”,似乎有一些特殊的魔法缺失。
我有以下项目/应用程序结构:
mysite
->mysite
->settings.py
->urls.py
->_init_.py
->wsgi.py
->polls (my app)
->models.py
->urls.py
->views.py
->templates
->polls
在本教程中,我们要求在templates-> polls目录中创建一个index.html,details.html,results.html文件,我们在这些文件中只有一些HTML视图。一切都很好。在tutorial中找到“使用通用视图:更少代码更好”之后,我遇到了麻烦。假设我应该从模板文件夹中删除index.html,details.html,results.html文件并且Django应该动态生成视图,我是错误的吗?我认为这是通用视图的重点,但现在我不确定。当我删除视图时,出现 templatedoesnotexist 错误。我是否需要对我的settings.py做一些事情让它知道我想看看django来生成视图?以下是标准生成的设置(这就是我所拥有的),我认为应该足以执行默认行为?
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
TEMPLATE_DEBUG = True
TEMPLATE_DIRS = [os.path.join(BASE_DIR, 'templates/'),]
如果您需要更多信息,请告诉我,但基本上我想知道我是否可以假设Django是否从模板生成视图?谢谢!
答案 0 :(得分:2)
你对Django的术语有点困惑。几乎所有视图都使用模板来呈现发送回浏览器的实际标记(HTML,XML等)。
Django Generic View只是编写自己的功能视图的基于类的版本。所以不是像:
def show_template_with_data(request):
template = "myapp/show_data.html"
return render(request, template, {'data1': 1, 'data2': 2})
您将使用Python类和OO并执行:
class ShowTemplateWithData(TemplateView):
template_name = "myapp/show_data.html"
def get_context_data(self, **kwargs):
context = super(ShowTemplateWithData, self).get_context_data(**kwargs)
context['data1'] = 1
context['data2'] = 2
return context
这两个是等效的,只是使用函数和其他基于类的视图。
在Django中,视图是决定采取什么操作,给模板提供什么数据的代码(例如基于登录用户)等等。“模板”只是带有占位符/循环/等的HTML显示它。
但不,你不应该删除模板HTML文件,两种视图样式都需要它们。