我已经在我的项目中使用django-mptt了一段时间了,这太棒了.最近,我发现需要覆盖使用mptt的模型的save()方法,当我尝试保存该模型的新实例时,我收到错误:
Exception Type: ValueError at /admin/scrivener/page/add/
Exception Value: Cannot use None as a query value
Run Code Online (Sandbox Code Playgroud)
我假设这是因为实例还没有插入树中,但我不确定如何解决这个问题.我在项目跟踪器的类似问题上添加了关于它的评论,但我希望这里的某个人能够更快地把我放在正确的轨道上.
这是追溯.
Environment:
Request Method: POST
Request URL: http://localhost:8000/admin/scrivener/page/add/
Django Version: 1.2 rc 1 SVN-13117
Python Version: 2.6.4
Installed Applications:
['django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.admin',
'django.contrib.sitemaps',
'mptt',
'filebrowser',
'south',
'haystack',
'django_static',
'etc',
'scrivener',
'gregor',
'annunciator']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware')
Traceback:
File "B:\django-apps\3rd Party Source\django\core\handlers\base.py" in get_response
100. response = callback(request, *callback_args, **callback_kwargs)
File "B:\django-apps\3rd Party Source\django\contrib\admin\options.py" in wrapper
239. return self.admin_site.admin_view(view)(*args, **kwargs)
File "B:\django-apps\3rd …Run Code Online (Sandbox Code Playgroud) 我正在开发一个hirerchical应用程序,其中叶节点可以是不同模型的实例.我无法弄清楚如何使它与django-mptt应用程序一起工作.这个应用程序甚至可以实现吗?如果是的话,我做错了什么?如果没有,那里有什么我想做什么?
以下是模型的基本结构:
class FolderItemBase(MPTTModel):
order = models.PositiveIntegerField()
class Meta:
abstract = True
class MPTTMeta:
parent_attr = 'folder'
order_insertion_by = ['order']
class Folder(FolderItemBase):
folder = TreeForeignKey('Folder', related_name='folders', blank=True, null=True)
...
class Image(FolderItemBase):
folder = TreeForeignKey('Gallery', related_name='images') # cannot be null since leaf has to be inside of a folder
...
Run Code Online (Sandbox Code Playgroud)
当我尝试执行以下操作时,我只能获取"文件夹"子项,而没有任何图像.当我试图获得图像的祖先时也是如此
>>> folder1 = Folder.objects.create(title='Folder 1', order=0)
>>> folder2 = Folder(title='Folder 2', order=0)
>>> folder2.insert_at(folder1, save=True)
>>> image = Image(...)
>>> image.insert_at(folder1, save=True)
>>> folder1.get_children()
[<Folder: Folder 2>]
>>> image.get_ancestores()
[] …Run Code Online (Sandbox Code Playgroud) 我们如何使用通用视图和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' …Run Code Online (Sandbox Code Playgroud) 我已经使用django-mptt对我要存储我的文章的标题的部分和子部分等进行建模.有些部分和部分会有孩子,有些则不会.例如:
[Home]
[News]
[Politics][Crime][Policing] etc
then [News] > [Politics]
[UKIP][Labour] etc
Run Code Online (Sandbox Code Playgroud)
我相信你明白了.我创建了Section模型
class Section(MPTTModel):
name = models.CharField(max_length=50)
parent = TreeForeignKey('self',null=True, blank=True, related_name='sub_sections')
tree = SectionTreeManager()
Run Code Online (Sandbox Code Playgroud)
并通过将Section.objects.all()传递到模板中: -
<ul class="headernav" >
{% recursetree sections %}
<li>
<a href="/section/{{node.name}}" >{{ node.name }}</a>
{% if node.is_leaf_node %}
<ul class="headernav">
{{ children }}
</ul>
{% endif %}
</li>
{% endrecursetree %}
</ul>
Run Code Online (Sandbox Code Playgroud)
我可以显示所有节点.我想要做的是,根据当前的网址,即/ section/News,获得当前级别的所有兄弟姐妹,以及以下级别的所有祖先和所有相关的后代.所以,如果我选择了新闻,我会得到
[home][**News**][World][Sports][Culture] <- Level 0
[Politics][Crime][Education] <- Children on Level 1
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?任何帮助将非常感激.我正在学习Django,所以如果很明显我会事先道歉.
MyModel有一个mptt的TreeForeignKey字段category.在管理员中MyModel,如何在Select此category字段的窗口小部件中禁用某些选项?
谢谢
class Category(MPTTModel):
parent = TreeForeignKey('self', blank=True, null=True, related_name='children')
nom = models.CharField(max_length=100)
class MyModel(models.Model):
category = TreeForeignKey(Category)
# more fields
Run Code Online (Sandbox Code Playgroud) 我有一个Django-CMS 2.4.1项目,总是给我警告:
DeprecationWarning: Implicit manager CMSPlugin.tree will be removed in django-mptt 0.6. Explicitly define a TreeManager() on your model to remove this warning.
Run Code Online (Sandbox Code Playgroud)
这只发生在生产中 - 而不是在开发中.
我试过了:
./manage.py cms fix-mptt
Run Code Online (Sandbox Code Playgroud)
这给了我输出(在与上面相同的警告之后):
fixing mptt page tree
fixing mptt plugin tree
all done
Run Code Online (Sandbox Code Playgroud)
但是......这并没有解决问题,例如,如果我重复命令它再次做同样的事情,同样的警告.
警告似乎没有造成任何伤害,但我想它将与下一版本的django-mptt.任何人都可以给我任何建议吗?
谢谢
我使用django-mptt存储类别层次结构,我需要以下面的格式序列化所有类别数据.
{
"id": 1,
"name": "FOOD"
"children": [
{
"id": 6,
"name": "PIZZA"
},
{
"id": 7,
"name": "BURGER"
}
],
},
{
"id": 2,
"name": "ALCOHOL"
"children": [
{
"id": 8,
"name": "WINE"
},
{
"id": 9,
"name": "VODKA"
}
],
},
}
Run Code Online (Sandbox Code Playgroud)
我正在使用django REST框架ModelViewset和序列化程序.怎么办?
我已将 django-mptt 添加到现有数据库,并创建新的迁移。
迁移过程中要求提供的默认值level,left,right和这样的领域,但不将添加model.rebuild操作迁移文件。
如何手动将重建操作添加到迁移文件?
我想知道关于django-mptt的事情,因为我正在考虑将它用于工程协调项目.
我会有一个Model类(比如说'Interface'),在Tree中有一个到Model的ForeignKey(比如'Location').
我能否按照他们所指的位置深度过滤接口?深度是父母的数量.
我还不知道如何组织我的数据,这就是我要问的原因.我正在考虑使用django-mptt(与在部署时由循环创建的模型相对,每个模型对应一个树级别),但我害怕它会阻止我的某个点并迫使我审查我的整个项目.
我在尝试让导入导出适用于 mptt 模型时遇到问题。这是我的代码:
模型.py
from django.db import models
from mptt.models import MPTTModel, TreeForeignKey
class MyModel(MPTTModel):
name = models.CharField(max_length=255)
parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children')
active = models.BooleanField(default=True,null=False,blank=False)
sort_order = models.PositiveIntegerField(default=0,null=True,blank=True)
class MPTTMeta:
order_insertion_by = ['name']
class Meta:
ordering = ['sort_order']
def __str__(self):
return self.name
Run Code Online (Sandbox Code Playgroud)
管理员.py
from django.contrib import admin
from mptt.admin import MPTTModelAdmin, DraggableMPTTAdmin
from .models import MyModel
from import_export import resources
from import_export.admin import ImportExportModelAdmin, ImportExportMixin
class MyModelResource(resources.ModelResource):
class Meta:
model = MyModel
exclude = ('lft','rght','tree_id','level')
@admin.register(MyModel)
class …Run Code Online (Sandbox Code Playgroud)