跳转到主要内容

为knockout.js设计的超级简单的Django模型视图

项目描述

![Django knockout!](http://i.imgur.com/Nf7Vxq6.gif)

django-knockout-modeler [![构建状态](https://travis-ci.org/Miserlou/django-knockout-modeler.svg)](https://travis-ci.org/Miserlou/django-knockout-modeler) [![PyPI](https://img.shields.io/pypi/dm/django-knockout-modeler.svg?style=flat)](https://pypi.python.org/pypi/django-knockout-modeler/)
==============

**django-knockout-modeler**使得在使用knockout.js与Django模型一起使用变得超级简单。这对于拥有许多不同模型的项目、拥有许多不同字段或两者兼而有之的项目来说都非常棒。它可以用于原型设计复杂应用程序以及直接在简单模板中直接使用。

**django-knockout-modeler**将以下内容转换成这样:

```python
class MyObject(models.Model)
myNumber = models.IntegerField()
myName = models.CharField()

myObjects = MyObject.objects.all()
```

变成这样

```javascript
var MyObjectData = [{
"myNumber": 666,
"myName": "Gabe Newell"
}];

function MyObject(data) {
myNumber = ko.observable(),
myName = ko.observable()
}

function MyObjectViewModel() {
var self = this;
self.myobjects = ko.observableArray(MyObjectData);

self.addMyObject = function(myobject) {
self.myobjects.push(myobject);
};
self.removeMyObject = function(myobject){
self.myobjects.remove(myobject)
};
self.sortMyObjectsAsc = function(){
self.myobjects(self.myobjects().sort(function(a, b) {
return a.myNumber>b.myNumber?-1:a.myNumber }));
};
self.sortMyObjectsDesc = function(){
self.myobjects(self.myobjects().sort(function(a, b) {
return a.myNumberb.myNumber?1:0;
}));
};
}

ko.applyBindings(new MyObjectViewModel(), $('#myobjects')[0]);
```

只需这样!

```django
{{ myObjects|knockout }}
```

快速开始
------------

0. 安装 django-knockout-modeler

```python
pip install django-knockout-modeler
```

1. 将 'knockout-modeler' 添加到你的 INSTALLED_APPS 设置中,如下所示

```python
INSTALLED_APPS = (
...
'knockout_modeler',
)
```

2. 在你的 HTML 中包含 Knockout.js

```html
<script type='text/javascript' src='https://cdnjs.cloudflare.com/ajax/libs/knockout/2.3.0/knockout-min.js'></script>
```

4. Knockout 你的 QuerySet

```html
{% load knockout %}
<script>
{{ myObjects|knockout }}
</script>
```

5. 模板化你的结果

```html
<script type="text/html" id="myTemplate">
<div>
<h2><span data-bind="text: myName"></span></h2>
<h3><span data-bind="text: myNumber"></span></h3>
</div>
</script>
```

6. 遍历你的绑定数据如下

```html
<div id="myobjects">
<div data-bind="template: { name: 'myTemplate', foreach: myobjects }"></div>
</div>
```

简单用法
---------

**django-knockout-modeler** 可以直接在模板中使用来生成 knockout 模型和准备好的数据,或者你可以选择其中一个。要将 QuerySet 直接放入 django 模板作为 Knockout 对象,你可以这样做

```django
{{ myObjects | knockout }}
```

要单独获取数据对象,你可以这样做

```django
{{ myObjects | knockout_data }}
```

同样,如果你想从 api 加载数据,你可以只获取模型,如下所示

```django
{{ myObjects | knockout_model }}
```

甚至只是绑定

```django
{{ myObjects | knockout_bindings }}
```

程序性用法
---------

首先,导入它!

```python
from knockout_modeler.ko import ko, ko_data, ko_model, ko_json, ko_data
```

要获取整个模板,你可以这样做

```python
ko_s = ko(your_query_set)
```

要获取只是数据字符串,你可以这样做..

```python
ko_s = ko_data(your_query_set)
```

或者..

```python
ko_s = ko_json(your_query_set)
```

出人意料的是,你也可以对模型字符串做同样的事情

```python
ko_s = ko_model(YourModel)
```

自定义字段集也是允许的

```python
fields = ['custom', 'fieldset', 'allowed']
ko_s= ko(entries, fields)
```

访问控制
----------

如果你不想将整个模型暴露给 Knockout,你可以在你的模型中定义一个函数

```python
def knockout_fields(self)
return['name', 'number']
```

默认情况下,它使用对象的 __to_dict()__ 方法中的键。对于计算属性,你可以使用 Python 的 __property__ 函数。

排序
----------

django-knockout 提供了一些方便的方法来排序你的数据。默认情况下,它将使用对象的 'id' 字段,但你也可以定义自己的比较器如下所示

```python
@classmethod
def comparator(self)
return 'value'
```

如果你没有定义比较器,'id' 必须在你的 knockout_fields 中。

多模型支持
----------

django-knockout 已经准备好同时使用多种类型的数据,因为绑定发生在特定对象上

```javascript
ko.applyBindings(new MyObjectViewModel(), $('#myobjects')[0]);
```

这意味着在你的 HTML 模板中的某个地方,你需要有一个具有该 id 的对象,如下所示

```html
<div id="myobjects">
<div data-bind="foreach: myobjects">
User <span data-bind="text: myName"></span> is number <span data-bind="text: myNumber"></span>.
</div>
</div>
```

这对于原型设计很有用,但对于更复杂的应用程序,可能需要使用 [master ViewModel](http://stackoverflow.com/a/9294752/1135467) 技术。

多数据支持
----------

如果你正在使用多个相同类型的 QuerySet,你需要为数据变量定义一个自定义名称。

```django
{{ myObjects | knockout_data:'MyNamedObjectsData' }}
```

你也可以传递字符串 ",safe" 来表示数据已经被清理。你必须也使用 'safe' 模板标签

```django
{{ myObjects | knockout_data:'MyNamedObjectsData,safe'|safe }}
```

问题
-------

可能还有更多可以做的事情来改进这个。如果你发现任何问题,请提交问题!


项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源代码分布

此版本没有提供源代码分布文件。请参阅有关生成分发存档的教程。

构建的分发

django_knockout_modeler-0.11.0-py2-none-any.whl (12.0 kB 查看哈希值)

上传时间 Python 2