因此,这个问题让我很头疼最初-我尝试了不同的方法,但没有一个是令人满意的-试图使一个动态排序的mp_树是我在这一点上会极力劝阻,这是一个太多的混乱。最好坚持在插入时创建的顺序,并在该阶段处理所有变量。同时我也感谢@solarissmoke在评论中提供的帮助。
模型
class Product(AbstractProduct):
# ...
@property
def site_categories(self):
return self.categories.filter(django_site_id=settings.SITE_ID)
@property
def first_category(self):
if not self.site_categories:
return None
return self.site_categories[0]
class Category(AbstractCategory):
# ...
django_site = models.ForeignKey(Site, null=False)
site_rank = models.IntegerField(_('Site Rank'), null=False, default=0)
node_order_by = ['django_site_id', 'site_rank', 'name']
模板标记
拷贝
templatetags/category_tags#get_annotated_list
要稍微投影和修改它:
# ...
start_depth, prev_depth = (None, None)
if parent:
categories = parent.get_descendants()
if max_depth is not None:
max_depth += parent.get_depth()
else:
categories = Category.get_tree()
# Just add this line
categories = categories.filter(django_site_id=settings.SITE_ID)
# ...
模板
为了
templates/catalogue/detail.html
:替换
{% with category=product.categories.all.0 %}
具有
{% with category=product.first_category %}
行政
您需要对中的视图、窗体和窗体集进行更改
apps.dashboard
照顾新增加的
django_site
和
site_rank
-我把它忘了,因为在我的例子中,所有类别都是通过一个规则导入的CSV来定义的。这应该不是什么大不了的事情-也许以后我会这样做,并会更新这个答案。
创建MP节点
每当添加根节点、子节点或同级节点时,现在需要传入
django_site_id
参数(以及包含在
node_order_by
,例如:
parent_category.add_child(
django_site_id=settings.SITE_ID, site_rank=10, name='Child 1')
Category.add_root(
django_site_id=settings.SITE_ID, site_rank=1, name='Root 1')