以登录状态显示菜单中的链接

时间:2014-08-13 08:56:31

标签: django mezzanine

使用Mezzanine,可以使用“需要登录”切换轻松切换显示或不显示常规页面。

我想使用此切换为链接类型的页面,不幸的是它不在那里。在Mezzanine中实现切换效果的最佳方法是什么?

我可能可以从Link类继承并执行类似这样的操作

class LoginLink(Link):
    login_required = models.BooleanField(_("Login required"), default=False,
        help_text=_("If checked, only logged in users can view this page"))

并使用LoginLink作为页面类型,但我希望有更好的解决方案。一个更好的解决方案将具有以下内容:

  • 没有新的网页类型
  • 没有搞乱核心Mezzanine

我很确定我提出的解决方案有效(但我真的不喜欢它)。是否可以扩展Mezzanine Link类型,只有我自己的链接类型在管理员中可见?

1 个答案:

答案 0 :(得分:0)

我找到了一个非常短而且甜蜜的解决方案。好处是login_required已经可以通过pages_page用于所有页面,因此我们不必进行任何数据库修改。使用此解决方案,您将失去创建默认链接类型的选项,但在我的情况下,从可用性角度来看,这是一个加分。 One Link类型就足够了。我的解决方案的代码如下,并进入admin.py

# Get the Mezzannine admin logic and the Link model
from mezzanine.pages.admin import LinkAdmin
from mezzanine.pages.models import Link

# Create a custom LoginLink, with the login_required code from the page.
from copy import deepcopy
class LoginLinkAdmin(LinkAdmin):
    fieldsets = deepcopy(LinkAdmin.fieldsets) + \
             ((None, {"fields": ("login_required",)}),)

# Unregister and register the LinkAdmin
admin.site.unregister(Link)
admin.site.register(Link, LoginLinkAdmin)

添加此内容应该是复制和粘贴。

修改

我后来发现这是documentation中的首选方式。但是,这似乎只适用于我的开发环境,而不适用于我们类似生产的环境。进一步搜索引导我进入Model Customization docs。我没有让这个工作,但它给了我一个新的想法。 Mezzanine会覆盖标准的admin.site功能,如/mezzanine/boot/lazy_admin.py中的此评论中所述:

"""
Defers calls to register/unregister until autodiscover is called
to avoid load issues with injectable model fields defined by
``settings.EXTRA_MODEL_FIELDS``.
"""

所以我提出了另一个解决方案。我已在urls.py之后将上面的代码放在我的admin.autodiscover()中,并将其从admin.py中删除。这很难看但似乎有效。