Django CRUD:在CRUD更新后重新加载对象

时间:2019-05-28 17:49:40

标签: python django django-models django-signals django-simple-menu

我正在处理项目中的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 """
     ...

但是我不知道这是正确的方法,还是如何实现菜单。

您有这样做的想法吗?

0 个答案:

没有答案