我正在处理项目中的dynamical object menu
(使用django-simple-menu),我有一些问题要在更新后显示出来。特别是在更新后立即重新加载菜单以显示更改。
我有一个简单模型:
class MyModel(models.Model):
""" A class to manage navbar menu of the application """
collection = models.ManyToManyField('app.Collection', related_name='collection_list', symmetrical=False)
application = models.ForeignKey('app.WebApplication', verbose_name=_('application'), related_name='application', on_delete=models.CASCADE)
title = models.CharField(max_length=30, verbose_name=_('title'), default=('Xth Edition (Current)'))
order = models.PositiveSmallIntegerField(default=1, verbose_name=_('menu order'), blank=True, null=False)
display = models.BooleanField(verbose_name=_('Display menu'), default=True)
class Meta:
verbose_name = _('menu setting')
verbose_name_plural = _('menu settings')
此模型由django-crud库处理。
然后我有一个 menu.py文件,其中包含:
class CustomMenu(Menu):
def __init__(self):
self.create_custom_menu()
def create_custom_menu(self):
qs_custom = MyModel.objects.filter(display=True).order_by('application', 'order')
for menu in qs_custom:
slug = slugify(menu.title)
# children menu
children = []
for col in menu.collection.all():
children.append(
CustomMenuItem(col.title, reverse('#')))
self.add_item(slug, CustomMenuItem(menu.title, f'#{slug}', children=children))
self.add_item('toto', MenuItem(_('Toto'), '#'))
self.add_item('tata', MenuItem(_('Tata'), '#'))
Menu.add_item('home', MenuItem(_('Home'), '/home'))
CustomMenu()
Menu.add_item('content', MenuItem(_('Content'), '#content', children=content_children))
Menu.add_item('admin', MenuItem(_('Admin'), '#admin', children=settings_children))
菜单类可用here。
我的问题:
当我更新模型时(例如,通过检查布尔字段以显示对象),导航栏中的对象菜单不会立即显示。我必须重新启动服务器以考虑更改。
我尝试使用信号:
@receiver(signals.post_save, sender=MyModel)
def auto_reload_menu(sender, instance, **kwargs):
""" Reload menu after create or update menu object """
...
但是我不知道这是正确的方法,还是如何实现菜单。
您有这样做的想法吗?