django抽象类允许'set it and forget it!'模型的行为。
django-model-gatekeeper的Python项目详细描述
#gatekeeper是一个简单的django应用程序,它支持"设置并忘记它!"发布模型的行为。
将"gatekeeper"添加到已安装的应用程序设置中,如下所示:
````
已安装的应用程序=[
…
"gatekeeper",
]
`````
但你只想让一些文章在网站上"直播"。
现在;
*有些文章可能会被删除(稍后再发布)
*有些文章已经准备好发布,但您希望它们只在稍后的日期生效。
在这里,您需要做的只是将"gateKeeperAbstractModel"抽象类的子类,例如:
````
来自django.db import models
来自gateKeeper.models import gateKeeperAbstractModel
类文章(gateKeeperAbstractModel):
…(这里是您的自定义字段)
```
>超类创建两个字段:
1。` live_as_of`(datetime,default=none)-这是对象应该激活的时间戳。如果没有设置(无),可以将其视为"开发中"阶段。对于文章模型,您已经创建了实例,但仍在编写文章。你可以通过管理员预览它,但它不在网站上。`发布状态`(受控词汇,默认值=无)-这有4个可能的值:
*none=从未发布过-硬连接不向公众提供
您可以通过管理员设置"发布状态"和"实时"值。
以项目模型为例,这里是列表和详细视图的相应视图代码。
````
from django.views.generic import detail view,listview
from.models import article
from gatekeeper.mixins import gatekeeperlistmixin,gateKeeperDetailMixin
类articleListView(gateKeeperListMixin,ListView):
model=article
template\u name='article/article\u list.html'
context\u object\u name='articles'
class articleDetailView(gateKeeperDetailMixin,detailview):
model=article
template\u name='article/article\u detail.html'
context\u object\u name='article'
````
幕后发生的事情:
1。在ListView中,网关管理员使用以下规则筛选模型:
1。如果用户登录到管理和"发布状态"!=-1,包含模型实例。如果没有用户,且"发布状态"为1,则包括模型实例3。如果没有用户,`publish_status`=0,*和*current date/time>;`live_as_of`,则包括模型实例。
4。返回已筛选的模型实例列表。
2。在detailview中,gatekeeper遵循相同的规则,但是如果用户没有登录到admin并且请求对象还没有"活动",则会抛出404错误。
在最近的三篇文章中。如果您只是按照以下行创建一个QuerySet:
``most廑u recent廑articles=article.objects.order廑by(-date廑created)[:3]```
它将包含articles,而不管它们的网关情况如何。
将规则保存到您生成的任何查询集。
\应用规则并返回经过筛选的QuerySet。
```
来自GateKeeper.View实用程序导入视图GateKeeper
…
最近的文章=文章.objects.order_by('-date_created')
最近的文章=查看GateKeeper(最近的文章,is-auth)
…
```
is-auth参数允许您根据发出请求的用户是否登录进行筛选。如果它们已经登录,那么那些不存在但仍对管理员可用的对象将"通过"网关守卫。为此,您需要设置"is_auth=self.request.user.is_authenticated"。(我能看到的唯一一次是,如果你想看到一个特定的非实时对象如何在生成的内容功能中"播放"。
我发现我几乎不需要它。通常,对于构建的对象列表,您只想看到活动的内容,所以在几乎所有我使用过"view_gatekeeper"的情况下,我都设置了"is_auth=false"。当您登录到管理员时,您仍然可以通过其详细信息页"查看"所有非活动对象。
=对象网关守护者(我的文章是auth)
…
````
我需要它的一个例子是,当我有一个列表来自外部源时,其中一个模型中的对象有重叠。我想显示所有外部对象,并构造到重叠对象的链接,但前提是它们是活动的。
你可以用看门人来做这件事。
一个很好的例子就是主页应用程序。您可以将主页的不同格式副本排队,以便在不同时间上线。
模型和视图代码只有一个小小的更改:
```
来自django.db import model s
来自django.utils.translation import ugettext\u lazy as\uu
来自gatekeeper.models import gatekeeperseriaalabstractmodel
类主页(gatekeeperseriaalabstractmodel):
标题=models.charfield(
uu('title'),
max_length=200,
null=false
)
def get_absolute_url(self):
return reverse('homepage-detail',args=(self.pk))
def_uu str_uuu(self):
返回self.title
class meta:
verbose_u name='主页'
verbose_u name_u polarial='主页'
```
与以前一样,"gatekeeperserialabstractmodel"创建"live"和"publish"状态字段。它还创建一个"default_live"字段。
detailview):
model=homepage
template_name='homepage/homepage_detail.html'
context_object_name='homepage'
`````
在"urls.py"中设置"urls.py`
有一点小变化。您需要两个条目。
```
from django.urls import path
from.views import homepagedetailview
urlpattents=(
path(''',homepagedetailview.as_view(),name='homepage-live'),
path('homepage/<;int:pk>;/',homepagedetailview.as_view(),name='homepage-detail'),
)
````
如果您登录到管理员,您可以查看任何主页nstance(带有`/homepage/<;pk>;/`url)。
2.但是,对于"live"站点,我们发送的是不带"pk"的url。
3。'gatekeeperserialmixin` mixin-如果没有提供pk,将尝试查找模型的"最合适"实例。
*规则0:只有可以播放的对象才能播放(即"发布状态"不能为-1)
*规则1:如果您的日期是将来的,则不能播放` live_a s_of`is not none)
*规则3:禁止-选择"发布状态"为1的最新修改页(这是因为"始终打开"页可能从未经历过带有发布日期的发布步骤-它只是被迫on)
*规则4:禁止-选择最近修改的带有"发布状态"的页面!=-1的"default_live"=true。
*规则5:禁止-none(和404)。
注意规则4---这就是"default_live"字段的作用。您可以定义一个"default_live"为true的模型实例。如果没有其他实例通过规则,则返回此项。基本上,它可以是模型的通用"回退",以便公共页面总是返回一些内容。方便!
utils.py`-helper函数
is_queryset=false)
````
,其中object_set为:
1。具有子类"gateKeeperserialAbstractModel"的模型(并且"is_querySet=false"),或者;
2。来自具有子类"gateKeeperserialAbstractModel"的模型的查询(在这里发送"is_querySet=true")。
两个字段被添加到"list_display"(列表显示)中(它们将在modeladmin中的任何设置之后出现):
1。一个"show_publish_status",它将"live_as_of"和"publish_status"字段作为字段,并从中创建一个友好的字符串;
2。一个"available\u to\u public"模型属性,返回true/false以显示"这对公众可用吗"?
对于"串行"网守,还有两个字段:
1。`像以前一样显示"发布"状态。` is_live`-返回true/false以显示哪个项将显示在Live网站上。
\fieldsets
所有与GateKeeper相关的字段都显示在名为"GateKeeper"的字段集中的"模型管理"编辑页上。
管理员的列表页,定义了五个管理员操作:
1。""还原为预览/挂起状态":这将"live"设置为"of",将"publish"设置为"none"。该项不再有效,在更改这些值之前不会生效;
2。"使项目永久处于活动状态:设置"发布状态"为1---项目将处于活动状态;
3。"立即生效":这将"立即生效"设置为"立即生效",并且"发布状态"设置为0--项目将处于有效状态;
4。有条件地在线使用"live"作为"date"的"live":这将"publish"状态设置为0,并将"live"保持为"of"的状态。如果要更改永久有效或完全脱机的设置,可以使用此选项;
5。"使项目完全脱机:这将设置"发布状态"-1--项目完全从站点中消失。
以及"从模型中获取适当的对象"实用方法。运行"python runtests.py"。
_
他是管理员吗?如果是的话,您仍然可以"看到"不存在的页面。
把守大门。如果"父"模型A的网关设置会影响模型B,则可以根据模型A的设置将内容设置为覆盖模型B。例如,如果有作者和图书的模型,则可以设置为如果作者不在,则所有图书都不在。这对于您可能希望一次实时获取多个页面的站点来说很方便。
"独立"项
(将从pbsmm测试用例中添加)
,但有时您不希望父模型控制其子模型。独立模型不会检查其父级的权限。
例如,您可能希望限制为特定作者显示的图书,但此图书除外。因此,您可以为这本书设置"视为独立",并根据"live"和"publish"状态的"live"设置,设置是否为"live",而无需检查该书作者的相同值。
将"gatekeeper"添加到已安装的应用程序设置中,如下所示:
````
已安装的应用程序=[
…
"gatekeeper",
]
`````
但你只想让一些文章在网站上"直播"。
现在;
*有些文章可能会被删除(稍后再发布)
*有些文章已经准备好发布,但您希望它们只在稍后的日期生效。
在这里,您需要做的只是将"gateKeeperAbstractModel"抽象类的子类,例如:
````
来自django.db import models
来自gateKeeper.models import gateKeeperAbstractModel
类文章(gateKeeperAbstractModel):
…(这里是您的自定义字段)
```
>超类创建两个字段:
1。` live_as_of`(datetime,default=none)-这是对象应该激活的时间戳。如果没有设置(无),可以将其视为"开发中"阶段。对于文章模型,您已经创建了实例,但仍在编写文章。你可以通过管理员预览它,但它不在网站上。`发布状态`(受控词汇,默认值=无)-这有4个可能的值:
*none=从未发布过-硬连接不向公众提供
您可以通过管理员设置"发布状态"和"实时"值。
以项目模型为例,这里是列表和详细视图的相应视图代码。
````
from django.views.generic import detail view,listview
from.models import article
from gatekeeper.mixins import gatekeeperlistmixin,gateKeeperDetailMixin
类articleListView(gateKeeperListMixin,ListView):
model=article
template\u name='article/article\u list.html'
context\u object\u name='articles'
class articleDetailView(gateKeeperDetailMixin,detailview):
model=article
template\u name='article/article\u detail.html'
context\u object\u name='article'
````
幕后发生的事情:
1。在ListView中,网关管理员使用以下规则筛选模型:
1。如果用户登录到管理和"发布状态"!=-1,包含模型实例。如果没有用户,且"发布状态"为1,则包括模型实例3。如果没有用户,`publish_status`=0,*和*current date/time>;`live_as_of`,则包括模型实例。
4。返回已筛选的模型实例列表。
2。在detailview中,gatekeeper遵循相同的规则,但是如果用户没有登录到admin并且请求对象还没有"活动",则会抛出404错误。
在最近的三篇文章中。如果您只是按照以下行创建一个QuerySet:
``most廑u recent廑articles=article.objects.order廑by(-date廑created)[:3]```
它将包含articles,而不管它们的网关情况如何。
将规则保存到您生成的任何查询集。
\应用规则并返回经过筛选的QuerySet。
```
来自GateKeeper.View实用程序导入视图GateKeeper
…
最近的文章=文章.objects.order_by('-date_created')
最近的文章=查看GateKeeper(最近的文章,is-auth)
…
```
is-auth参数允许您根据发出请求的用户是否登录进行筛选。如果它们已经登录,那么那些不存在但仍对管理员可用的对象将"通过"网关守卫。为此,您需要设置"is_auth=self.request.user.is_authenticated"。(我能看到的唯一一次是,如果你想看到一个特定的非实时对象如何在生成的内容功能中"播放"。
我发现我几乎不需要它。通常,对于构建的对象列表,您只想看到活动的内容,所以在几乎所有我使用过"view_gatekeeper"的情况下,我都设置了"is_auth=false"。当您登录到管理员时,您仍然可以通过其详细信息页"查看"所有非活动对象。
=对象网关守护者(我的文章是auth)
…
````
我需要它的一个例子是,当我有一个列表来自外部源时,其中一个模型中的对象有重叠。我想显示所有外部对象,并构造到重叠对象的链接,但前提是它们是活动的。
你可以用看门人来做这件事。
一个很好的例子就是主页应用程序。您可以将主页的不同格式副本排队,以便在不同时间上线。
模型和视图代码只有一个小小的更改:
```
来自django.db import model s
来自django.utils.translation import ugettext\u lazy as\uu
来自gatekeeper.models import gatekeeperseriaalabstractmodel
类主页(gatekeeperseriaalabstractmodel):
标题=models.charfield(
uu('title'),
max_length=200,
null=false
)
def get_absolute_url(self):
return reverse('homepage-detail',args=(self.pk))
def_uu str_uuu(self):
返回self.title
class meta:
verbose_u name='主页'
verbose_u name_u polarial='主页'
```
与以前一样,"gatekeeperserialabstractmodel"创建"live"和"publish"状态字段。它还创建一个"default_live"字段。
detailview):
model=homepage
template_name='homepage/homepage_detail.html'
context_object_name='homepage'
`````
在"urls.py"中设置"urls.py`
有一点小变化。您需要两个条目。
```
from django.urls import path
from.views import homepagedetailview
urlpattents=(
path(''',homepagedetailview.as_view(),name='homepage-live'),
path('homepage/<;int:pk>;/',homepagedetailview.as_view(),name='homepage-detail'),
)
````
如果您登录到管理员,您可以查看任何主页nstance(带有`/homepage/<;pk>;/`url)。
2.但是,对于"live"站点,我们发送的是不带"pk"的url。
3。'gatekeeperserialmixin` mixin-如果没有提供pk,将尝试查找模型的"最合适"实例。
*规则0:只有可以播放的对象才能播放(即"发布状态"不能为-1)
*规则1:如果您的日期是将来的,则不能播放` live_a s_of`is not none)
*规则3:禁止-选择"发布状态"为1的最新修改页(这是因为"始终打开"页可能从未经历过带有发布日期的发布步骤-它只是被迫on)
*规则4:禁止-选择最近修改的带有"发布状态"的页面!=-1的"default_live"=true。
*规则5:禁止-none(和404)。
注意规则4---这就是"default_live"字段的作用。您可以定义一个"default_live"为true的模型实例。如果没有其他实例通过规则,则返回此项。基本上,它可以是模型的通用"回退",以便公共页面总是返回一些内容。方便!
utils.py`-helper函数
is_queryset=false)
````
,其中object_set为:
1。具有子类"gateKeeperserialAbstractModel"的模型(并且"is_querySet=false"),或者;
2。来自具有子类"gateKeeperserialAbstractModel"的模型的查询(在这里发送"is_querySet=true")。
两个字段被添加到"list_display"(列表显示)中(它们将在modeladmin中的任何设置之后出现):
1。一个"show_publish_status",它将"live_as_of"和"publish_status"字段作为字段,并从中创建一个友好的字符串;
2。一个"available\u to\u public"模型属性,返回true/false以显示"这对公众可用吗"?
对于"串行"网守,还有两个字段:
1。`像以前一样显示"发布"状态。` is_live`-返回true/false以显示哪个项将显示在Live网站上。
\fieldsets
所有与GateKeeper相关的字段都显示在名为"GateKeeper"的字段集中的"模型管理"编辑页上。
管理员的列表页,定义了五个管理员操作:
1。""还原为预览/挂起状态":这将"live"设置为"of",将"publish"设置为"none"。该项不再有效,在更改这些值之前不会生效;
2。"使项目永久处于活动状态:设置"发布状态"为1---项目将处于活动状态;
3。"立即生效":这将"立即生效"设置为"立即生效",并且"发布状态"设置为0--项目将处于有效状态;
4。有条件地在线使用"live"作为"date"的"live":这将"publish"状态设置为0,并将"live"保持为"of"的状态。如果要更改永久有效或完全脱机的设置,可以使用此选项;
5。"使项目完全脱机:这将设置"发布状态"-1--项目完全从站点中消失。
以及"从模型中获取适当的对象"实用方法。运行"python runtests.py"。
_
他是管理员吗?如果是的话,您仍然可以"看到"不存在的页面。
把守大门。如果"父"模型A的网关设置会影响模型B,则可以根据模型A的设置将内容设置为覆盖模型B。例如,如果有作者和图书的模型,则可以设置为如果作者不在,则所有图书都不在。这对于您可能希望一次实时获取多个页面的站点来说很方便。
"独立"项
(将从pbsmm测试用例中添加)
,但有时您不希望父模型控制其子模型。独立模型不会检查其父级的权限。
例如,您可能希望限制为特定作者显示的图书,但此图书除外。因此,您可以为这本书设置"视为独立",并根据"live"和"publish"状态的"live"设置,设置是否为"live",而无需检查该书作者的相同值。