Soa*_*ask 3 django crud django-models django-mptt
我们如何使用通用视图和django-mptt实现CRUD功能?我搜索了很多,找不到一个教程/示例代码.
假设我们有一个课程层次结构或类别层次结构,或者类似的东西...我们如何添加/删除/更新/读取它们?
比如我有这个模型:
from django.db import models
from mptt.models import MPTTModel , TreeForeignKey
class Genre(MPTTModel):
name = models.CharField(max_length = 50 , unique = True)
parent = TreeForeignKey('self' , null = True , blank = True , related_name = 'children')
class MPTTMeta:
order_insertion_by = ['name']
Run Code Online (Sandbox Code Playgroud)
这个views.py:
from django.views.generic.list_detail import object_list
from mp.models import Genre
def genres_list(request):
''' Shows all of the genres '''
return object_list(request,
queryset = Genre.tree.all() ,
template_name = 'genres.html' ,
# template_object_name = 'nodes' ## Adding "nodes" variable didn't solve the problem
)
Run Code Online (Sandbox Code Playgroud)
好吧...我收到此错误(错误在行号"5":{%recursetree nodes%}):
Caught VariableDoesNotExist while rendering: Failed lookup for key [nodes] in u"[{'paginator': None, 'is_paginated': False, 'page_obj': None, 'nodes_list': [<Genre: Genre object>, <Genre: Genre object>, <Genre: Genre object>, <Genre: Genre object>]}, {'csrf_token': <django.utils.functional.__proxy__ object at 0x7f5bb810f090>}, {'perms': <django.utils.functional.__proxy__ object at 0x7f5bb810ff10>, 'messages': <django.contrib.messages.storage.user_messages.LegacyFallbackStorage object at 0x324af50>, 'user': ....................................
<html>
2
3 {% load mptt_tags %}
4 <ul>
5 {% recursetree nodes %}
6 <li>
7 {{node.name}}
Run Code Online (Sandbox Code Playgroud)
使用MPTT模型和基于类的通用视图的简单CRUD应用程序(Django 1.4 基于函数的实现已被弃用).
让我们开始
urls.py
from django.conf.urls.defaults import patterns, include, url
from django.views.generic import DetailView, ListView, CreateView, UpdateView
from genre.models import Genre
urlpatterns = patterns('',
url(r'detail/(?P<pk>\d+)', DetailView.as_view(model=Genre), name="genre_detail",),
url(r'update/(?P<pk>\d+)', UpdateView.as_view(model=Genre), name="genre_update",),
url(r'create', CreateView.as_view(model=Genre), name="genre_create",),
url(r'list', ListView.as_view(model=Genre), name="genre_list",),
)
Run Code Online (Sandbox Code Playgroud)
models.py
from django.core.urlresolvers import reverse
from django.db import models
from mptt.models import MPTTModel
class Genre(MPTTModel):
name = models.CharField(max_length=50 , unique=True)
parent = models.ForeignKey('self' , null=True , blank=True , related_name='children')
def get_absolute_url(self):
return reverse('genre_detail', kwargs={'pk': self.pk, })
class MPTTMeta:
order_insertion_by = ['name']
Run Code Online (Sandbox Code Playgroud)
模板/ genre_detail.html
<html>
<body>
<div>Object: {{ object }}</div>
<div>Object's name: {{ object.name }}</div>
<div>Object's parent: {{ object.parent }}</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
模板/ genre_form.html
<html>
<body>
<form action="" method="post">
{% csrf_token %}
{{ form.as_ul }}
<button>save</button>
</form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
模板/ genre_list.html
{% load mptt_tags %}
<html>
<body>
<ul class="root">
{% recursetree object_list %}
<li>
{{ node.name }}
{% if not node.is_leaf_node %}
<ul class="children">
{{ children }}
</ul>
{% endif %}
</li>
{% endrecursetree %}
</ul>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
就是这样.
今天我有空闲时间,并在github https://github.com/kaygorodov/simple-crud-mptt上分享了这个项目.
如何定义自己的基于类的视图?
体裁/ views.py
from django.view.generic import UpdateView
class MyCustomUpdateView(UpdateView):
model = Genre
def get_form_kwargs(self):
"""
Returns the keyword arguments for instanciating the form.
"""
kwargs = super(MyCustomUpdateView, self).get_form_kwargs()
kwargs.update({'my_first_param_to_init_form': 1,
'my_second_param_to_init_form': 2,
})
return kwargs
Run Code Online (Sandbox Code Playgroud)
体裁/ urls.py
url(r'update/(?P<pk>\d+)', MyCustomUpdateView.as_view(), name="genre_update",),
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2668 次 |
| 最近记录: |