我在一次采访中被问到这个问题,大概是为了看看我是否理解模板层和模型层之间的分离。
我的理解是模板变量本质上是:
- 实例的静态副本(以便可以访问所有属性)
- 所有带有参数的方法都被“隐藏”的实例(这样它们就不能被调用,但可以调用没有参数的方法)
因此,如果您有一个仅包含没有参数的方法的模型,并将一个实例传递到模板中,您能说它是该实例的静态副本吗?这是考虑模板变量的正确方法吗?
更新:
模板( View )层是否能够更新模型(例如,从自定义上下文处理器)?如果不是,那么如果 Django 框架不复制模型实例,它如何阻止这种情况发生?如果是,那么这是否与典型的 Web 框架 MVC 设计存在重大偏差,在典型的 Web 框架 MVC 设计中,数据仅沿从模型到 View 的一个方向流动?
最佳答案
问题不在于变量是静态副本。只是模板语言本身不允许您调用带有参数的方法。它仍然是您正在访问的同一对象,只是无法用语言表达某些编程概念(赋值、传递参数等)。
回复您的更新: 是的,如果模型具有修改对象的方法并且该方法不带任何参数,则模板层可以更新模型。但仅仅因为你可以做某事并不意味着你应该做某事。不要认为因为 Django 的开发人员没有完全阻止某些事情就意味着它是完全可以接受的,但如果那是您真正想做的,那么没有什么可以阻止您。
关于python - Django 模板变量可以是模型实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32508107/