我正在尝试制作使用 django-mptt 管理的 FeinCMS 页面树的副本。我写了这个函数:
def make_tree_copy(page, parent=None):
'''
Makes a copy of the tree starting at "page", reparenting it to "parent"
'''
new_page = Page.objects.create_copy(page)
new_page.save()
Page.tree.move_node(new_page, parent)
# re-read so django-mptt fields get updated
new_page = Page.objects.get(id=new_page.id)
for child in page.get_children():
# re-read so django-mptt fields get updated
child = Page.objects.get(id=child.id)
make_tree_copy(child, new_page)
Run Code Online (Sandbox Code Playgroud)
并调用它使用
make_tree_copy(Page.tree.root_nodes()[0])
Run Code Online (Sandbox Code Playgroud)
它一般有效,但是当我有一个看起来像这样的页面树时:
A
|- B
|- C
|- D
Run Code Online (Sandbox Code Playgroud)
它出来是这样的:
A
|- B
|- D
|- C
Run Code Online (Sandbox Code Playgroud)
从我逐步完成 mptt 代码来看,神奇似乎发生在 mptt/managers.py/_inter_tree_move_and_close_gap() 中,由于某种原因,孙子的“lft”值发生了变化。在移动之前它们是 C=3,D=5,之后它们是 C=5,D=3。 …
我在Django遇到了一个与DB有关的问题,我不明白.
我定义了一个MPTT模型:
class Image(MPTTModel):
name = models.CharField(max_length=50)
parent = TreeForeignKey('self', null=True, blank=True, related_name='children')
def __unicode__(self):
return self.name
def rank(self): leaves = self.get_leafnodes() if leaves: rank = leaves[0].get_level() - self.get_level() else: rank = 0 return rank
mptt.register(Image, order_insertion_by=['name'])
Run Code Online (Sandbox Code Playgroud)
然后在我的视图中,我尝试使用模型的一些语句,并得到一个OperationalError.
def index(request):
if request.method == 'POST':
image_string = request.POST.get('get_image')
index = image_string.find('(')
if index == -1:
parent = image_string
child = None
else:
parent = image_string[0:index]
child = image_string[index+1:len(image_string)-1]
try:
images = Image.objects.all()
image_names = [a.name for a in images]
except Image.DoesNotExist: …
Run Code Online (Sandbox Code Playgroud) 这是情况。我在 Django 中使用 MPTT 模型来创建音乐流派(摇滚、硬摇滚等)的层次结构。我正在将此层次结构的节点之一分配给相册。假设我创建了一个具有 Hard Rock 流派的专辑对象。如何查询我的专辑以获取所有摇滚专辑并使其包含摇滚和摇滚类型的所有后代?
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']
def __unicode__(self):
return self.name
class Album(models.Model):
name= models.CharField(max_length=200)
genre= models.ForeignKey(Genre)
Run Code Online (Sandbox Code Playgroud) 出于某种原因,我在添加到管理员时没有看到任何语言选项卡。我正在使用 Django 1.9.10。我正在使用 django-hvad 但决定尝试 parler。我在一个新项目中尝试了完全相同的代码并且它有效,但在我现有的项目中却没有。请注意,我也在使用 django-mptt。在与 mptt 模型不同的模型中尝试 parler,反之亦然。
settings/base.py
# Translations
gettext = lambda s: s
LANGUAGES = (
('en', gettext('English')),
('ar', gettext('Arabic')),
)
LOCALE_PATHS = (
os.path.join(BASE_DIR, "locale"),
)
# # Parler Configuration
PARLER_LANGUAGES = {
None: (
{'code': 'ar', },
{'code': 'en',},
),
'default': {
'fallback': 'ar', # defaults to PARLER_DEFAULT_LANGUAGE_CODE
'hide_untranslated': False, # the default; let .active_translations() return fallbacks too.
}
}
PARLER_DEFAULT_LANGUAGE_CODE = 'ar'
Run Code Online (Sandbox Code Playgroud)
模型
class Category(MPTTModel, TranslatableModel):
slug = models.SlugField(max_length=50, unique=True, null=True, blank=True) …
Run Code Online (Sandbox Code Playgroud) 我的 Django MPTT 模型有问题
class Catalog(MPTTModel):
name = models.CharField(verbose_name='name',max_length=256,blank=True )
name_slug = models.CharField(verbose_name='Name_slug',max_length=250,blank=True)
parent = TreeForeignKey('self',null=True,blank=True,related_name='children')
class MPTTMeta:
order_insertion_by = ['name']
def __unicode__(self):
return u"%s %s %s " %(self.name,self.name_slug,self.parent)
def __str__(self):
return u"%s %s %s " %(self.name,self.name_slug,self.parent
def get_absolute_url(self):
return reverse("catalog",kwargs={"slug":self.name_slug})
Run Code Online (Sandbox Code Playgroud)
现在,我在 base.html 中使用 MPTT,如下所示:
<ul class="root">
{% recursetree nodes %}
<li>
<a href="{{ node.get_absolute_url }}">{{ node.name }}</a>
{% if not node.is_leaf_node %}
<ul class="children">
<a href="{{ children.get_absolute_url }}">{{ children }}</a>
</ul>
{% endif %}
</li>
{% endrecursetree %}
Run Code Online (Sandbox Code Playgroud)
但是,当我使用 …
我有一个模型,它有一个这样的字段:
parent = TreeForeignKey('self', null=True, blank=True, related_name='children')
我想将父级添加到选择框中,然后使用 onclick 选择第二级子级。
parent1
-section1
--child1
parent2
-section2
--child2
Run Code Online (Sandbox Code Playgroud)
我已经尝试了所有的东西。(level__gt), (level__lt) ....我已经阅读了 django-mptt 文档。怎么接二胎?我不想使用 ul 和 li。我想在一个选择中添加所有父母,然后通过点击获取第二个孩子给父母。
任何帮助,将不胜感激。
我已经编写了一个数据迁移文件,用于为MPTT模型创建一些初始数据。
但是创作失败了
def create_foo(apps, schema_editor):
db_alias = schema_editor.connection.alias
logger = logging.getLogger(__name__)
Foo = apps.get_model("app", "Foo")
for attr in ROLES:
try:
foo = Foo.objects.using(db_alias).get(name=attr[0])
except Foo.DoesNotExist:
parent = Foo.objects.using(db_alias).get(name=attr[1]) if attr[1] else None
if parent:
foo = Foo.objects.create(name=attr[0], parent=parent)
else:
foo = Foo.objects.using(db_alias).create(name=attr[0])
logger.info("Created foo - %s" % foo)
Run Code Online (Sandbox Code Playgroud)
我在执行以下代码时遇到错误,有什么想法吗?
foo = Foo.objects.using(db_alias).create(name=attr[0])
文件“ /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/MySQLdb/connections.py”,行36,在defaultErrorhandler中引发错误类,错误值django.db.utils.IntegrityError:( 1048,“列'lft'不能为空”