Я работаю над 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))
Класс меню доступен здесь .
Моя проблема:
Когда я обновляю свою модель (например, проверяя логическое поле для отображения объекта), меню моего объекта в панели навигации не отображается сразу.Я должен перезапустить сервер, чтобы учесть это изменение.
Я пытался использовать сигналы:
@receiver(signals.post_save, sender=MyModel)
def auto_reload_menu(sender, instance, **kwargs):
""" Reload menu after create or update menu object """
...
Но я не знаю, правильный ли это путь и как я могу реализоватьменю.
У вас есть идея сделать это?