在Django中创建通用视图

时间:2014-11-18 20:17:51

标签: python django

好的,所以我是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是否从模板生成视图?谢谢!

1 个答案:

答案 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文件,两种视图样式都需要它们。