使用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 Link类型,只有我自己的链接类型在管理员中可见?
答案 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
中删除。这很难看但似乎有效。