- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经看过几个Django教程。
我注意到基于静态HTML模板文件生成动态Web内容,有2种方法
在django.conf.urls.url
中使用url.py
。指向将调用django.shortcuts.render
的命名函数。
在django.urls.path
中使用url.py
。指向一个从django.views.generic.TemplateView
继承的命名类。
两种方式产生相同的结果。
我想知道,如何确定给定情况下使用哪种方式?
最佳答案
基于类的视图(CBV)和基于函数的视图(FBV)可以做相同的事情:在特定视图在功能上等效的意义上,始终可以将CBV“转换”为FBV,反之亦然。
支持基于类的视图(CBV)
CBV通常用于抽象出通用逻辑。例如,在模板视图中,您无需调用render(..)
,这对我们来说是隐式完成的:我们只需要提供模板的名称即可。此外,如果稍后发现某个“代码流”存在问题,可以很容易地在特定视图中对此进行修补,因此所有视图都可以立即修复,而如果错误位于FBV中,则我们需要修补所有这些FBV。
它还将视图拆分为一组可重用的组件:例如,一个DetailView
具有一个用于计算要渲染的对象的组件,一个可以向上下文中添加额外数据的组件以及执行实际渲染的方法。 。如果以后要允许在该视图上发出POST请求,则已经有那些组件可用。
CBV还可以通过使用面向对象的技术(如(多个)继承和混合)轻松地创建临时控制流:无需实现特定的控制流,可以定义一个混合,然后将其混合到应具有的视图中控制流发生了变化。
这也使子视图的子类化变得很容易:如果您有一个显示所有记录的视图,则需要两层衬里,才能对该视图进行子类化以在新视图中对记录进行分页。如果以后再更改旧的记录视图,则此更改也会立即对所有子类产生影响(但是,有时可能会产生不利的副作用)。
从某种意义上来说,不同的HTTP请求的处理也更简洁,因为它们是单独的方法(视图可以具有get(..)
,post(..)
,patch(..)
等方法),而在基于函数的视图中,通常用if request.method == 'POST'
处理。通常,这会导致以下事实:处理非POST请求(例如PATCH)就像是GET一样,而建议您返回“ 405 Method Not Allowed”错误。可以通过基于函数的视图来完美地解决此问题,但是这需要一些额外的工作,因此经常被忽略。
最终,Django有许多通用的View
子类来处理常见情况,例如呈现对象列表,创建或更新模型对象的新实例等。许多用例(几乎)完全被CBV覆盖,因此只需要子类化该特定视图,然后填写详细信息(模板名称,对模型的引用等)。这也导致了更具声明性的编程:说出您想要的内容,而不是您想要的内容。例如,Django的ListView
支持分页。
支持基于功能的视图(FBV)
但是,基于函数的视图显示了控制流,而在基于类的视图中,这是隐藏的,因此更像是Django魔术。由于所有操作都是在“幕后”进行的,因此无法看到控制流会使调试视图变得更加困难,并且由于某些视图的某些特殊性,可能会发生错误。
基于函数的视图也往往更易于实现:您获得一个request
对象以及可选的一些(URL)参数,并且需要将其转换为HTTP响应。您不必为我需要获取哪个对象而推理:您可以简单地在函数中以即席样式获取对象(当然,您也可以在CBV中执行此操作,但这并不是a背后的想法。 CBV)。
最终,Django还提供了大量功能装饰器,例如@login_required
(CBV有相应的部分)。通常,对函数装饰器的含义进行推理要比对视图子类化的含义进行推理更容易:子类化可以对视图的所有方法产生影响。此外,具有多重继承的子类化并不总是那么简单:Python使用方法解析顺序(MRO)来确定super().some_method()
是什么,但这可能会导致一些棘手的副作用,而<<的实现者可能没有预见到这些副作用。 cc> s或查看mixins。
Django转向基于类的视图
但是,当您查看Django的开发时,您会看到从基于函数的视图向基于类的视图的转变:例如,在django-2.1中,已删除了基于View
基于函数的视图。在django-1.11中引入了CBV对应项(login
)。但是,这并不意味着Django开发人员必须将所有内容都编写为CBV:Django通常涵盖相当通用的视图,因此在这种情况下使用CBV更有意义。
关于python - 在django.shortcuts.render和django.views.generic.TemplateView之间选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52024378/
我对 Python-Django 和 web 开发还很陌生,我被困在这个使用 POST 创建新资源的特殊问题上。 我正在为 REST API 使用 Django REST 框架,我正在尝试创建一个新资
我已经使用 Django-storages 成功地将 Word 文档存储到 S3。 class Document(TitleSlugDescriptionModel, TimeStampedModel
我有 2 个关于模型代理的问题, 如何从模型对象创建代理对象? 如何从模型查询集创建代理查询集? 例如,假设我们定义了: from django.contrib.auth.models import
我想编写一个直接执行 HTTP 请求的单元测试(而不是使用 django.test.client.Client)。 如果您好奇为什么 - 那是因为我想测试我从 Django 应用程序公开的 Thrif
我为我的个人网站启动了一个 django 项目来学习 django。到目前为止,我已经将我的开发环境设置为我需要的一切,并遵循 this很棒的教程来创建一些基本的数据结构和模板。现在我想开始使用我之前
我已经阅读了很多关于如何在使用 Django 注册时添加额外字段的信息,例如 here 、 here 和 here 。代码片段是: forms.py(来自注册应用程序) class Registrat
我正在编写小型社交应用程序。功能之一是在网站标题中写入用户名。因此,例如,如果我登录并且我的名字是Oleg(用户名),那么我应该看到: Hello, Oleg | Click to edit prof
我有一个使用 Django 和 Django Rest 框架开发的应用程序。我想将 django-reversion 功能添加到我的应用程序中。 我已经尝试过http://django-reversi
我有一个简单的 HTML 表单,我没有使用 Django 表单,但现在我想添加一个选择。 选择最容易创建为 Django ChoiceField (与通过循环等手动创建选择相反),但是,如果没有在 D
我不明白为什么人们以两种方式编写外键,这样做的目的是什么?它们是相同还是不同? 我注意到有些人这样写: author = models.ForeignKey(Author, on_delete=mod
我想在我的 Django 应用程序中获取评论最多的十个帖子,但我做不到,因为我想不出合适的方法。 我目前正在使用 django 评论框架,并且我已经看到使用 aggregate or annotate
这对于 Django 1.2 仍然有效吗? Custom Filter in Django Admin on Django 1.3 or below 我已经尝试过,但管理类中的 list_filter
问题在于,当 django-compressor 编译为 .js 文件的 CoffeeScript 文件中引用 {{ STATIC_URL }} 时,它无法正确加载。 在我的 django 模板中,我
我正在尝试将一些字段从一个 django 模型移动到一个新模型。假设我有一个书籍模型: class Book(models.Model): title = models.CharField(max
我想在我的 Django 应用程序中获取评论最多的十个帖子,但我做不到,因为我想不出合适的方法。 我目前正在使用 django 评论框架,并且我已经看到使用 aggregate or annotate
目前我正在寻找在 Django 中实现访问控制。我已经阅读了有关内置权限的内容,但它并不关心每个对象的基础。例如,我想要“只有创建者可以删除自己的项目”之类的权限。所以我读到了 django-guar
嗨,我正在将我的 Django 模型的一个字段的值设置为其他模型的另一个字段的值。这个值应该是动态变化的。 这是我的第一个模型 class MainModel(AbstractBaseUser, Pe
我正在尝试为我的模型创建一个编辑表单。我没有使用模型表单,因为根据模型类型,用户可以使用不同的表单。 (例如,其中一个表单有 Tinymce 小部件,而另一个没有。) 有没有什么方法可以使用模型设置表
Django 模板中的搜索字段 如何在类似于此图像的 Django 模板中创建搜索字段 http://asciicasts.com/system/photos/1204/original/E354I0
根据 Django documentation ,如果 Django 安装激活了 AuthenticationMiddleware,HttpRequest 对象有一个“user”属性代表当前登录的用户
我是一名优秀的程序员,十分优秀!